【程序实现】已知两条线的直线方程,求交点

笔算法

已知两条直线的方程:

$$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
2
3
4
5
6
7
val det = A1*B2 - A2*B1
if (det == 0) {
//两条直线平行
} else {
val x = (B2*C1-B1*C2)/det
val y = (A1*C2-A2*C1)/det
}

这个公式是怎么得出来的呢,给方程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$$