游戏中的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条线段之内。
原文地址:https://www.cnblogs.com/terrynoya/p/13233829.html