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之间。