我有个圈子。圈内是一个点。我有一个起源于此点的向量。我想知道这个向量相交的圆上的哪个点。这是一张图:
http://n4te.com/temp/circle.png http://n4te.com/temp/circle.png
红点是我想要确定的点。
我知道这些事情:圆的中心,矢量的原点和矢量的方向。
我知道这是基本的东西,但我仍然遇到麻烦。大多数谷歌搜索引发了我的线圈碰撞,这是相关但不完全相同的。感谢您提供的任何帮助!
答案 0 :(得分:11)
O — center of circle (vector)
r — its radius (scalar)
A — origin of ray (vector)
k — direction of ray (vector)
为标量(A + kt - O)² = r²
解决t
,选择正根,A + kt
是您的观点。
进一步说明:
.
是dot product,²对于向量是向量与自身的点积。展开LHS
(A + kt - O)² = (A - O)² + 2(k.(A - O))t + k²t².
二次方为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
。
答案 1 :(得分:7)
非常感谢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.
}