游戏中的2d数学-两条直线之间的交点

原文参考

http://www-cs.ccny.cuny.edu/~wolberg/capstone/intersection/Intersection point of two lines.html

有两条直线,p1(x1,y1)和p2(x2,y2)构成直线A,p3(x3,y3)和p4(x4,y4)构成直线B

那么我们可以用参数方程描述这2条直线:

Pa=P1+ua(P2P1)
Pb=P3+ub(P4P3)

当2条直线相交,Pa=Pb,我们可以得到下面2个关于uaub的方程:

x1+ua(x2x1)=x3+ub(x4x3)
y1+ua(y2y1)=y3+ub(y4y3)

解方程得到uaub:

ua=(x4x3)(y1y3)(y4y3)(x1x3)(y4y3)(x2x1)(x4x3)(y2y1)

ub=(x2x1)(y1y3)(y2y1)(x1x3)(y4y3)(x2x1)(x4x3)(y2y1)

将结果回代到对应的原式中得到交点:

x=x1+ua(x2x1)
y=y1+ua(y2y1)

注:

  • ua和ub的分母相同
  • 当分母是0时,2条直线平行
  • 当ua和ub的分子和分母同时为0时,2条直线重合
  • 本公式是关于直线的,如果需要对线段进行相交判断的话,仅需要继续检查ua和ub是否在0-1之间即可。只要ua和ub其中一个在0-1范围之间,那么对应的线段包含交点。如果ua和ub都在0-1之间,那么交点同时在2条线段之内。
posted @   jeoyao  阅读(400)  评论(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 让容器管理更轻松!
点击右上角即可分享
微信分享提示