游戏中的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 = P_1 + u_a ( P_2 - P_1 )\)
\(Pb = P_3 + u_b ( P_4 - P_3 )\)

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

\(x_1 + u_a (x_2 - x_1) = x_3 + u_b (x_4 - x_3)\)
\(y_1 + u_a (y_2 - y_1) = y_3 + u_b (y_4 - y_3)\)

解方程得到\(u_a\)\(u_b\):

\(u_a=\frac{(x_4-x_3)(y_1-y_3)-(y_4-y_3)(x_1-x_3)} {(y_4-y_3)(x_2-x_1)-(x_4-x_3)(y_2-y_1)}\)

\(u_b=\frac{(x_2-x_1)(y_1-y_3)-(y_2-y_1)(x_1-x_3)} {(y_4-y_3)(x_2-x_1)-(x_4-x_3)(y_2-y_1)}\)

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

\(x = x_1 + u_a (x_2 - x_1)\)
\(y = y_1 + u_a (y_2 - y_1)\)

注:

  • ua和ub的分母相同
  • 当分母是0时,2条直线平行
  • 当ua和ub的分子和分母同时为0时,2条直线重合
  • 本公式是关于直线的,如果需要对线段进行相交判断的话,仅需要继续检查ua和ub是否在0-1之间即可。只要ua和ub其中一个在0-1范围之间,那么对应的线段包含交点。如果ua和ub都在0-1之间,那么交点同时在2条线段之内。
posted @ 2020-07-04 09:45  jeoyao  阅读(381)  评论(0编辑  收藏  举报