【程序实现】已知两条线的直线方程,求交点
笔算法
已知两条直线的方程:
$$A_1x+B_1y+C_1=0$$
$$A_2x+B_2y+C_2=0$$
大家都知道的求交点方法,消元:
$$A_1B_2x+B_1B_2y+B_2C_1=0$$
$$A_2B_1x+B_1B_2y+B_1C_2=0$$
然后两式相减:
$$(A_1B_2-A_2B_1)x=B_2C_1-B_1C_2$$
即可得到交点的x坐标:
$$x=\frac{(A_1B_2-A_2B_1)}{B_2C_1-B_1C_2}$$
然后带入方程1:
$$A_1[\frac{A_1B_2-A_2B_1}{B_2C_1-B_1C_2}]+B_1y+C_1=0$$
化简得到:
$$y=\frac{C_1}{B_1}-\frac{A_1}{B_1}\frac{A_1B_2-A_2B_1}{B_2C_1-B_1C_2}$$
如果按照以上方法用程序实现,也没什么问题,简单粗暴,但有没有更简单的方法呢,有!
程序实现
直线方程推导
先来看另外一个问题,已知一条直线过两点$P_1(x_1,y_1)$和$P_2(x_2,y_2)$,求该直线方程
设直线方程$Ax+By-C=0$
很容易可以推导出:
$$A=y_2-y_1$$
$$B=x_1-x_2$$
$$C=Ax_1+By_1$$
直线交点公式
设两条直线的方程为:
$$A_1x+B_1y-C_1=0$$
$$A_2x+B_2y-C_2=0$$
程序实现如下:
1 | val det = A1*B2 - A2*B1 |
这个公式是怎么得出来的呢,给方程1乘以$B_2$,给方程2乘以$B_1$,也就是使用上述消元法可得到:
$$A_1B_2x+B_1B_2y=C_1B_2$$
$$A_2B_1x+B_1B_2y=C_2B_1$$
两式相减:
$$(A_1B_2-A_2B_1)x=C_1B_2-C_2B_1$$
可以看到x的乘数就是上边的det变量,而等式右边的算式就是下边的x计算式的分子
同理,y的计算方法也是如此:
$$A_1A_2x+A_2B_1y=C_1A_2$$
$$A_1A_2x+A_1B_2y=C_2A_1$$
两式相减:
$$(A_1B_2-A_2B_1)y=C_2A_1-C_1A_2$$