游戏中的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),用参数方程表示这条直线的形式:

\(\begin{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之间。

posted @ 2020-07-02 16:12  jeoyao  阅读(420)  评论(0编辑  收藏  举报