已知两条直线(每条直线由2个点确定)求两条直线的交点。
1. 解方程组
我们的目的是要求两条直线相交的交点 , 求交点这就是即在直线1又在直线2的点(x,y),就是2个直线方程组的解(点同时满足两个直线方程)。不妨我们先看看如何解方程组,在下面一步我们说明下。
已知 两直线方程组 (我们这里先用一般式(标准式)标示), 用程序求解。方程组如下:
{
A
1
x
+
B
1
y
+
C
1
=
0
A
2
x
+
B
2
y
+
C
2
=
0
\left\{ \begin{array}{c} A_1x+B_1y+C_1=0 \\ A_2x+B_2y+C_2=0 \\ \end{array} \right.
{A1x+B1y+C1=0A2x+B2y+C2=0联立两个方程的解 即为公共交点 就是我们要的两条直线啊交点。
这里我们可以用 克莱姆法则直接求方程组的解(当然您可以用方程的变换求解,本质和我们用矩阵做初等变化求解方程是一样的)
根据 Cramer‘s Rule 当 系数矩阵 不为singular Matrix(奇异矩阵 :满秩序 <=>行列式值不为0<=> 直线不平行(即斜率 -A/B不等))时 ,注意:程序需要判断行列式的值不为0才可以进行计算 。
系数矩阵 D : [ A 1 B 1 A 2 B 2 ] 系数矩阵D:\begin{bmatrix} A1 & B1 \\ A2 & B2 \end{bmatrix} 系数矩阵D:[A1A2B1B2]
常数项替换 x 的系数矩阵 D 1 : [ − C 1 B 1 − C 2 B 2 ] 常数项替换x的系数矩阵{D_1}:\begin{bmatrix} -C_1 & B_1 \\ -C_2 & B_2 \end{bmatrix} 常数项替换x的系数矩阵D1:[−C1−C2B1B2]
常数项替换 y 的系数矩阵 D 2 : [ A 1 − C 1 A 2 − C 2 ] 常数项替换y的系数矩阵{D_2}:\begin{bmatrix} A_1 & -C_1 \\ A_2 & -C_2 \end{bmatrix} 常数项替换y的系数矩阵D2:[A1A2−C1−C2]
解:x =
D
1
D
\frac{D_1}{D}
DD1 , 即
x
=
(
−
C
1
)
B
2
−
(
−
C
2
)
B
1
A
1
B
2
−
A
2
B
1
(
1
)
x =\frac{ (- {C_1} ) {B_2} - (-{C_2}) {B_1} }{ {A_1} {B_2} - {A_2} {B_1} } \qquad (1)
x=A1B2−A2B1(−C1)B2−(−C2)B1(1)
解: y =
D
2
D
\frac{D_2}{D}
DD2 , 即’
y
=
A
1
(
−
C
2
)
−
A
2
(
−
C
1
)
A
1
B
2
−
A
2
B
1
(
2
)
y =\frac{ {A_1} (-{C_2} )- {A_2} (-{C_1}) }{ {A_1} {B_2} - {A_2} {B_1} } \qquad (2)
y=A1B2−A2B1A1(−C2)−A2(−C1)(2)
2. 两点确定直线方程
以上我们解决了已知2个直线的方程组,求方程组的解x y即为交点的方法。那么现在就差确定方程组了。
大多数情况下我们已知直线过两个点
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
{(x_1 , y_1 ),(x_2 , y_2 )}
(x1,y1),(x2,y2)
所以我们用 两点式 来建立直线方程(斜率 K1 = k2 直线上任意两不重复点斜率相等来建立等式 )
(
y
−
y
1
)
(
x
−
x
1
)
=
(
y
2
−
y
1
)
(
x
2
−
x
1
)
\frac{ (y - y_1) }{ ( x - x_1 )}= \frac{(y_2-y_1)}{( x_2 - x_1)}
(x−x1)(y−y1)=(x2−x1)(y2−y1)
注:
(
x
1
≠
x
2
,
y
1
≠
y
2
)
(x_1 ≠ x_2 ,y_1 ≠ y_2 )
(x1=x2,y1=y2)即程序需要判断不能选择一条直线的重复点。
下面我们把两点式整理为标准式 一下是多项式整理的过程:
由两点式变换得
(
x
2
−
x
1
)
(
y
−
y
1
)
=
(
y
2
−
y
1
)
(
x
−
x
1
)
(x_2-x_1)(y-y_1) = (y_2-y_1)(x-x_1)
(x2−x1)(y−y1)=(y2−y1)(x−x1)
我们展开系数合并x y的系数 ,变成系数为A B 和 常数项C变成标准式形式。
(
y
2
−
y
1
)
x
+
(
x
1
−
x
2
)
y
−
x
1
y
2
+
x
1
y
1
+
x
2
y
1
−
x
1
y
1
=
0
(
y
2
−
y
1
)
x
+
(
x
1
−
x
2
)
y
−
x
1
y
2
+
x
2
y
1
=
0
(
y
2
−
y
1
)
x
+
(
x
1
−
x
2
)
y
=
x
1
y
2
−
x
2
y
1
(y_2-y_1)x + (x_1-x_2)y - x_1y_2 + x_1y_1 + x_2y_1 - x_1y_1 = 0\\ (y_2-y_1)x + (x_1-x_2)y - x_1y_2 + x_2y_1 = 0\\ (y_2 - y_1)x + (x_1 -x_2)y = x_1y_2 - x_2y_1
(y2−y1)x+(x1−x2)y−x1y2+x1y1+x2y1−x1y1=0(y2−y1)x+(x1−x2)y−x1y2+x2y1=0(y2−y1)x+(x1−x2)y=x1y2−x2y1
这里就我们就得到了一个有2个点
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1)和
(
x
2
,
y
2
)
(x_2 ,y_2)
(x2,y2) 构成的标准式
同样的方式我们也可以写出一个由两个点
(
x
3
,
y
3
)
和
(
x
4
,
y
4
)
(x_3,y_3)和(x_4 ,y_4)
(x3,y3)和(x4,y4) 构成第二条直线方程的标准式
(
y
4
−
y
3
)
x
+
(
x
3
−
x
4
)
y
=
x
3
y
4
−
x
4
y
3
(y_4 - y_3)x + (x_3 -x_4)y = x_3y_4 - x_4y_3
(y4−y3)x+(x3−x4)y=x3y4−x4y3
那么通过点坐标建立的直线标准式方程组为:
{
(
y
2
−
y
1
)
x
+
(
x
1
−
x
2
)
y
+
(
−
(
x
1
y
2
−
x
2
y
1
)
)
=
0
(
y
4
−
y
3
)
x
+
(
x
3
−
x
4
)
y
+
(
−
(
x
3
y
4
−
x
4
y
3
)
)
=
0
\left\{ \begin{array}{c} (y_2 - y_1)x + (x_1 -x_2)y +(-(x_1y_2 - x_2y_1) )= 0\\ (y_4 - y_3)x + (x_3 -x_4)y + (-(x_3y_4 - x_4y_3 ))= 0\\ \end{array} \right.
{(y2−y1)x+(x1−x2)y+(−(x1y2−x2y1))=0(y4−y3)x+(x3−x4)y+(−(x3y4−x4y3))=0
对应上面的(
1
)和(
2
)我们可以看出
对应上面的(1)和(2)我们可以看出
对应上面的(1)和(2)我们可以看出
A
1
=
(
y
2
−
y
1
)
;
B
1
=
(
x
1
−
x
2
)
;
−
C
1
=
(
x
1
y
2
−
x
2
y
1
)。
A_1= (y_2 -y_1) ;B_1= (x_1 -x_2) ;-C_1 =(x_1y_2 - x_2y_1)。
A1=(y2−y1);B1=(x1−x2);−C1=(x1y2−x2y1)。
A
2
=
(
y
4
−
y
3
)
;
B
2
=
(
x
3
−
x
4
)
;
−
C
2
=
(
x
3
y
4
−
x
4
y
3
)。
A_2= (y_4 -y_3) ;B_2= (x_3 -x_4) ; -C_2 =(x_3y_4 - x_4y_3)。
A2=(y4−y3);B2=(x3−x4);−C2=(x3y4−x4y3)。
我们再把 方程系数带入 克莱姆法则求出的解(1)和(2)中
这样我们就能算出最终结果
x
=
(
x
1
y
2
−
x
2
y
1
)
(
x
3
−
x
4
)
−
(
x
3
y
4
−
x
4
y
3
)
(
x
1
−
x
2
)
(
y
2
−
y
1
)
(
x
3
−
x
4
)
−
(
y
4
−
y
3
)
(
x
1
−
x
2
)
x = \frac{ (x_1y_2 - x_2y_1)(x_3-x_4) - (x_3y_4-x_4y_3)(x_1-x_2) }{ (y_2-y_1)(x_3-x_4) - (y_4-y_3)(x_1-x_2) }
x=(y2−y1)(x3−x4)−(y4−y3)(x1−x2)(x1y2−x2y1)(x3−x4)−(x3y4−x4y3)(x1−x2)
y
=
(
y
2
−
y
1
)
(
x
3
y
4
−
x
4
y
3
)
−
(
y
4
−
y
3
)
(
x
1
y
2
−
x
2
y
1
)
(
y
2
−
y
1
)
(
x
3
−
x
4
)
−
(
y
4
−
y
3
)
(
x
1
−
x
2
)
y = \frac{ (y_2-y_1) (x_3y_4 - x_4y_3) -(y_4-y3)(x_1y_2-x_2y_1) }{ (y_2-y_1)(x_3-x_4) - (y_4-y_3)(x_1-x_2) }
y=(y2−y1)(x3−x4)−(y4−y3)(x1−x2)(y2−y1)(x3y4−x4y3)−(y4−y3)(x1y2−x2y1)
到此我们就可以编写代码计算上面的式子 写出输入为 2组 2个点 确定2条直线,输出为交点的函数。
注:在用上面的公式计算前我们一定不要忘记上面的”注:“来判断点是否重合了 或者两条直线平行线。