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

stackexchange参考文章

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

下面来复习一下

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

(xh)2+(yk)2=r2

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

{x(t)=(x1x0)t+x0y(t)=(y1y0)t+y0

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

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

((x1x0)t+x0h)2+((y1y0)t+y0k)2=r2

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

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

at2+bt+c=0

那么有:

a=(x1x0)2+(y1y0)2
b=2(x1x0)(x0h)+2(y1y0)(y0k)
c=(x0h)2+(y0k)2r2

用求根公式得到结果:

x=b±b24ac2a

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

posted @   jeoyao  阅读(447)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示