在发起圈子的传染媒介圈子的交叉点

Nat*_*teS 4 math geometry

我有个圈子.圈内是一个点.我有一个起源于此点的向量.我想知道这个向量相交的圆上的哪个点.这是一张图:

http://n4te.com/temp/circle.png http://n4te.com/temp/circle.png

红点是我想要确定的点.

我知道这些东西:圆的中心,矢量的原点和矢量的方向.

我知道这是基本的东西,但我仍然遇到麻烦.大多数谷歌搜索引发了我的线圈碰撞,这是相关但不完全相同的.感谢您的任何帮助,您可以提供!

Ant*_*hyy 13

基本矢量代数.

O — center of circle (vector)
r — its radius       (scalar)
A — origin of ray    (vector)
k — direction of ray (vector)
Run Code Online (Sandbox Code Playgroud)

解决(A + kt - O)² = r²标量t,选择正根,这A + kt是你的观点.

进一步说明:

.点积,²对于向量是向量与自身的点积.展开LHS

(A + kt - O)² = (A - O)² + 2(k.(A - O))t + k²t².
Run Code Online (Sandbox Code Playgroud)

二次方是k²t² + 2(k.(A - O))t + (A - O)² - r² = 0.就你的变量而言,这就变成了(rayVX² + rayVY²)t² + 2(rayVX(rayX - circleX) + rayVY(rayY - circleY))t + (rayX - circleX)² + (rayY - circleY)² - r² = 0.

  • @NateS:既然你在谈论向量,我认为你知道向量.请参阅en.wikipedia.org/wiki/Euclidean_vector.@Pete:如果你不明白发生了什么,为什么评论?该方程在一个变量中已经是四元数.@Acci:这个符号是相当标准的,从初中就开始使用它. (2认同)

Nat*_*teS 9

非常感谢Anton Tykhyy的详细解答.这是生成的Java代码:

float xDiff = rayX - circleX;
float yDiff = rayY - circleY;
float a = rayVX * rayVX + rayVY * rayVY;
float b = 2 * (rayVX * (rayX - circleX) + rayVY * (rayY - circleY));
float c = xDiff * xDiff + yDiff * yDiff - r * r;
float disc = b * b - 4 * a * c;
if (disc >= 0) {
    float t = (-b + (float)Math.sqrt(disc)) / (2 * a);
    float x = rayX + rayVX * t;
    float y = rayY + rayVY * t;
    // Do something with point.
}
Run Code Online (Sandbox Code Playgroud)