游戏中的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条线段之内。