圆上相交问题:由圆内部起点的向量在圆上的交点

4
我有一个圆。圆内有一个点。我有一个以该点为起点的向量。我想知道这个向量与圆相交的哪个点。下面是示意图: http://n4te.com/temp/circle.png http://n4te.com/temp/circle.png 红点是我要找出的那个点。
我知道这些信息:圆的中心,向量的起点和方向。
我知道这很基础,但我还是有困难。大部分搜索结果都是关于线和圆碰撞的,虽然相关但并不完全相同。谢谢您提供的任何帮助!

很抱歉,链接的图片已经消失了。它只是一个圆圈,里面有一个起点在圆圈内部并与圆相交的向量。 - NateS
2个回答

13

初等向量代数

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 是您的点。
进一步解释: .点积,对于向量的 ² 是向量与自身的点积。展开左侧。
(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


11
感谢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.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接