原文参考
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条线段之内。