xoy面上两直线交点算法

已知两条直线(每条直线由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[C1C2B1B2]

常数项替换 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[A1A2C1C2]

解: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=A1B2A2B1(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=A1B2A2B1A1(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)} (xx1)(yy1)=(x2x1)(y2y1)
注: ( x 1 ≠ x 2 , y 1 ≠ y 2 ) (x_1 ≠ x_2 ,y_1 ≠ y_2 ) (x1=x2y1=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) (x2x1)(yy1)=(y2y1)(xx1)
我们展开系数合并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 (y2y1)x+(x1x2)yx1y2+x1y1+x2y1x1y1=0(y2y1)x+(x1x2)yx1y2+x2y1=0(y2y1)x+(x1x2)y=x1y2x2y1
这里就我们就得到了一个有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 (y4y3)x+(x3x4)y=x3y4x4y3
那么通过点坐标建立的直线标准式方程组为:
{ ( 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. {(y2y1)x+(x1x2)y+((x1y2x2y1))=0(y4y3)x+(x3x4)y+((x3y4x4y3))=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=(y2y1)B1=(x1x2)C1=x1y2x2y1)。
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=(y4y3)B2=(x3x4)C2=x3y4x4y3)。

我们再把 方程系数带入 克莱姆法则求出的解(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=(y2y1)(x3x4)(y4y3)(x1x2)(x1y2x2y1)(x3x4)(x3y4x4y3)(x1x2)

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=(y2y1)(x3x4)(y4y3)(x1x2)(y2y1)(x3y4x4y3)(y4y3)(x1y2x2y1)
到此我们就可以编写代码计算上面的式子 写出输入为 2组 2个点 确定2条直线,输出为交点的函数。
注:在用上面的公式计算前我们一定不要忘记上面的”注:“来判断点是否重合了 或者两条直线平行线。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperVE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值