游戏中的2d数学-求线段和圆相交的交点

stackexchange参考文章

https://math.stackexchange.com/questions/311921/get-location-of-vector-circle-intersection

下面来复习一下

假设圆的中心为(h,k),半径为r,那么圆的方程式如下:

((x−h)^2+(y−k)2=r^2)

现在考虑线段。设线段的起点从 (x0,y0)到终点 (x1,y1),用参数方程表示这条直线的形式:

(egin{cases} x(t)=(x1−x0)t+x0\ y(t)=(y1−y0)t+y0\ end{cases})

t是实数。当0<t<1,t就表示起点和终点构成的线段之间的值。

现在我们用参数方程来替换圆的x,y 的话我们就得到了一个关于t的一元二次方程:

(((x1−x0)t+x0−h)^2+((y1−y0)t+y0−k)^2=r^2)

一般来说方程会有小于等于2个根。
但假如线段的起点在圆外,而终点在圆内,得到的结果也是2个实数根。其中一个根t在0-1之间,而另一个大于1。

一元二次方程一般形式如下:

(at2+bt+c=0)

那么有:

(a=(x1−x0)^2+(y1−y0)^2)
(b=2(x1−x0)(x0−h)+2(y1−y0)(y0−k))
(c=(x0−h)^2+(y0−k)^2−r^2)

用求根公式得到结果:

(x = {-b pm sqrt{b^2-4ac} over 2a})

如果线段的起点和终点不相等的话,则a为正数。
如果起点在圆外,则c为正数。
另外对于线段来说,根的有效值应该在0-1之间。

原文地址:https://www.cnblogs.com/terrynoya/p/13225396.html