分别已知两直线上的两点,求两直线交点

分别已知两直线上的两点,求两直线交点


求两直线的交点是初中数学的简单问题了,在直角坐标系中直线有很多种表示方式。同时我们知道两点确定一条直线,已知两点坐标自然能求出直线坐标,已知两直线坐标自然能求出两直线交点。


问题:分别已知两直线上的两点,求两直线交点,给出解析解。已知直线 l 1 l_1 l1 上有两点 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1, y_1), (x_2, y_2) (x1,y1),(x2,y2) ,直线 l 2 l_2 l2 上有两点 ( x 3 , y 3 ) , ( x 4 , y 4 ) (x_3, y_3), (x_4, y_4) (x3,y3),(x4,y4) ,求 l 1 , l 2 l_1, l_2 l1,l2 的交点 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 。(用 x 1 , x 2 , x 3 , x 4 , y 1 , y 2 , y 3 , y 4 x_1, x_2, x_3, x_4, y_1, y_2, y_3, y_4 x1,x2,x3,x4,y1,y2,y3,y4 来表示 x 0 , y 0 x_0, y_0 x0,y0


本篇摒弃一切奇技淫巧,使用最简单的原理暴力计算得到无需分类讨论的通用结果。原理简单但推导过程繁杂丑陋,数学方面有洁癖的朋友可以跳过推导直接取用结果。


原理: ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_0, y_0),(x_1, y_1), (x_2, y_2) (x0,y0),(x1,y1),(x2,y2) 共线,列出共线方程(方程①); ( x 0 , y 0 ) , ( x 3 , y 3 ) , ( x 4 , y 4 ) (x_0, y_0),(x_3, y_3), (x_4, y_4) (x0,y0),(x3,y3),(x4,y4) 共线,列出共线方程(方程②),两个方程解两个未知数,利用轮换对称原理化简计算得到答案。


( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_0, y_0),(x_1, y_1), (x_2, y_2) (x0,y0),(x1,y1),(x2,y2) 共线,列出共线方程①:
( y 0 − y 1 ) × ( x 0 − x 2 ) = ( y 0 − y 2 ) × ( x 0 − x 1 ) (y_0-y_1)\times(x_0-x_2) = (y_0-y_2) \times (x_0-x_1) (y0y1)×(x0x2)=(y0y2)×(x0x1)
( x 0 , y 0 ) , ( x 3 , y 4 ) , ( x 3 , y 4 ) (x_0, y_0),(x_3, y_4), (x_3, y_4) (x0,y0),(x3,y4),(x3,y4) 共线,列出共线方程②:(只需要上面方程的脚标1全部换成3,2全部换成4)
( y 0 − y 3 ) × ( x 0 − x 4 ) = ( y 0 − y 4 ) × ( x 0 − x 3 ) (y_0-y_3)\times(x_0-x_4) = (y_0-y_4) \times (x_0-x_3) (y0y3)×(x0x4)=(y0y4)×(x0x3)
方程①展开得到方程(3):
x 0 y 0 − x 0 y 1 − x 2 y 0 + x 2 y 1 = x 0 y 0 − x 1 y 0 − x 0 y 2 + x 1 y 2 . . . . . . ( 3 ) x_0y_0-x_0y_1-x_2y_0+x_2y_1=x_0y_0-x_1y_0-x_0y_2+x_1y_2......(3) x0y0x0y1x2y0+x2y1=x0y0x1y0x0y2+x1y2......(3)
方程(3)消去二次项,再合并未知数前面的系数,得到方程(4);由方程②经过同样的过程可以推得方程(5),但实际上只需要将方程(4)中脚标1全部换成3,2全部换成4即可得到方程(5):
( x 1 − x 2 ) y 0 + x 2 y 1 = ( y 1 − y 2 ) x 0 + x 1 y 2 . . . . . . ( 4 ) ( x 3 − x 4 ) y 0 + x 4 y 3 = ( y 3 − y 4 ) x 0 + x 3 y 4 . . . . . . ( 5 ) (x_1-x_2)y_0+x_2y_1=(y_1-y_2)x_0+x_1y_2......(4)\\(x_3-x_4)y_0+x_4y_3=(y_3-y_4)x_0+x_3y_4......(5) (x1x2)y0+x2y1=(y1y2)x0+x1y2......(4)(x3x4)y0+x4y3=(y3y4)x0+x3y4......(5)
至此问题变成了解出方程(4)和方程(5)组成的二元一次方程组。尝试采用消元的方式解出 x 0 x_0 x0 ,给方程(4)两边同时乘 ( x 3 − x 4 ) (x_3-x_4) (x3x4) 得到方程(6),给方程(5)两边同时乘 ( x 1 − x 2 ) (x_1-x_2) (x1x2) 得到方程(7):
( x 1 − x 2 ) ( x 3 − x 4 ) y 0 + ( x 3 − x 4 ) x 2 y 1 = ( x 3 − x 4 ) ( y 1 − y 2 ) x 0 + ( x 3 − x 4 ) x 1 y 2 . . . . . . ( 6 ) ( x 1 − x 2 ) ( x 3 − x 4 ) y 0 + ( x 1 − x 2 ) x 4 y 3 = ( x 1 − x 2 ) ( y 3 − y 4 ) x 0 + ( x 1 − x 2 ) x 3 y 4 . . . . . . ( 7 ) (x_1-x_2)(x_3-x_4)y_0+(x_3-x_4)x_2y_1=(x_3-x_4)(y_1-y_2)x_0+(x_3-x_4)x_1y_2......(6)\\(x_1-x_2)(x_3-x_4)y_0+(x_1-x_2)x_4y_3=(x_1-x_2)(y_3-y_4)x_0+(x_1-x_2)x_3y_4......(7) (x1x2)(x3x4)y0+(x3x4)x2y1=(x3x4)(y1y2)x0+(x3x4)x1y2......(6)(x1x2)(x3x4)y0+(x1x2)x4y3=(x1x2)(y3y4)x0+(x1x2)x3y4......(7)
用方程(6)减去方程(7)得到方程(8),即可得到 x 0 x_0 x0 的解:
( x 3 − x 4 ) ( x 2 y 1 − x 1 y 2 ) − ( x 1 − x 2 ) ( x 4 y 3 − x 3 y 4 ) = ( ( x 3 − x 4 ) ( y 1 − y 2 ) − ( x 1 − x 2 ) ( y 3 − y 4 ) ) x 0 . . . ( 8 ) (x_3-x_4)(x_2y_1-x_1y_2)-(x_1-x_2)(x_4y_3-x_3y_4)=((x_3-x_4)(y_1-y_2)-(x_1-x_2)(y_3-y_4))x_0...(8) (x3x4)(x2y1x1y2)(x1x2)(x4y3x3y4)=((x3x4)(y1y2)(x1x2)(y3y4))x0...(8)
由于轮换对称特性,将 x 0 x_0 x0 表达式中的x全部换为y,y全部换为x即可得到 y 0 y_0 y0 的解。


最终的解是:
x 0 = ( x 3 − x 4 ) ( x 2 y 1 − x 1 y 2 ) − ( x 1 − x 2 ) ( x 4 y 3 − x 3 y 4 ) ( x 3 − x 4 ) ( y 1 − y 2 ) − ( x 1 − x 2 ) ( y 3 − y 4 ) x_0=\frac{(x_3-x_4)(x_2y_1-x_1y_2)-(x_1-x_2)(x_4y_3-x_3y_4)}{(x_3-x_4)(y_1-y_2)-(x_1-x_2)(y_3-y_4)} x0=(x3x4)(y1y2)(x1x2)(y3y4)(x3x4)(x2y1x1y2)(x1x2)(x4y3x3y4)
y 0 = ( y 3 − y 4 ) ( y 2 x 1 − y 1 x 2 ) − ( y 1 − y 2 ) ( y 4 x 3 − y 3 x 4 ) ( y 3 − y 4 ) ( x 1 − x 2 ) − ( y 1 − y 2 ) ( x 3 − x 4 ) y_0=\frac{(y_3-y_4)(y_2x_1-y_1x_2)-(y_1-y_2)(y_4x_3-y_3x_4)}{(y_3-y_4)(x_1-x_2)-(y_1-y_2)(x_3-x_4)} y0=(y3y4)(x1x2)(y1y2)(x3x4)(y3y4)(y2x1y1x2)(y1y2)(y4x3y3x4)
当二者的分母为0时,两直线平行,没有交点。


为了方便各位在代码中搬运,再给出如下形式:

x0 = ((x3-x4) * (x2*y1 - x1*y2) - (x1-x2) * (x4*y3 - x3*y4)) / ((x3-x4) * (y1-y2) - (x1-x2) * (y3-y4));
y0 = ((y3-y4) * (y2*x1 - y1*x2) - (y1-y2) * (y4*x3 - y3*x4)) / ((y3-y4) * (x1-x2) - (y1-y2) * (x3-x4));

为了方便各位以数组的形式在代码中搬运,再给出如下形式:

x0 = ((x[2] - x[3]) * (x[1] * y[0] - x[0] * y[1]) - (x[0] - x[1]) * (x[3] * y[2] - x[2] * y[3])) / ((x[2] - x[3]) * (y[0] - y[1]) - (x[0] - x[1]) * (y[2] - y[3]));
y0 = ((y[2] - y[3]) * (y[1] * x[0] - y[0] * x[1]) - (y[0] - y[1]) * (y[3] * x[2] - y[2] * x[3])) / ((y[2] - y[3]) * (x[0] - x[1]) - (y[0] - y[1]) * (x[2] - x[3]));
  • 26
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值