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

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

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

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

问题:分别已知两直线上的两点,求两直线交点,给出解析解。已知直线 l1l_1l1​ 上有两点 (x1,y1),(x2,y2)(x_1, y_1), (x_2, y_2)(x1​,y1​),(x2​,y2​) ,直线 l2l_2l2​ 上有两点 (x3,y3),(x4,y4)(x_3, y_3), (x_4, y_4)(x3​,y3​),(x4​,y4​) ,求 l1,l2l_1, l_2l1​,l2​ 的交点 (x0,y0)(x_0, y_0)(x0​,y0​) 。(用 x1,x2,x3,x4,y1,y2,y3,y4x_1, x_2, x_3, x_4, y_1, y_2, y_3, y_4x1​,x2​,x3​,x4​,y1​,y2​,y3​,y4​ 来表示 x0,y0x_0, y_0x0​,y0​)

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

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

(x0,y0),(x1,y1),(x2,y2)(x_0, y_0),(x_1, y_1), (x_2, y_2)(x0​,y0​),(x1​,y1​),(x2​,y2​) 共线,列出共线方程①:

(y0−y1)×(x0−x2)=(y0−y2)×(x0−x1)

(y_0-y_1)\times(x_0-x_2) = (y_0-y_2) \times (x_0-x_1)

(y0​−y1​)×(x0​−x2​)=(y0​−y2​)×(x0​−x1​)

(x0,y0),(x3,y4),(x3,y4)(x_0, y_0),(x_3, y_4), (x_3, y_4)(x0​,y0​),(x3​,y4​),(x3​,y4​) 共线,列出共线方程②:(只需要上面方程的脚标1全部换成3,2全部换成4)

(y0−y3)×(x0−x4)=(y0−y4)×(x0−x3)

(y_0-y_3)\times(x_0-x_4) = (y_0-y_4) \times (x_0-x_3)

(y0​−y3​)×(x0​−x4​)=(y0​−y4​)×(x0​−x3​)

方程①展开得到方程(3):

x0y0−x0y1−x2y0+x2y1=x0y0−x1y0−x0y2+x1y2......(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)

x0​y0​−x0​y1​−x2​y0​+x2​y1​=x0​y0​−x1​y0​−x0​y2​+x1​y2​......(3)

方程(3)消去二次项,再合并未知数前面的系数,得到方程(4);由方程②经过同样的过程可以推得方程(5),但实际上只需要将方程(4)中脚标1全部换成3,2全部换成4即可得到方程(5):

(x1−x2)y0+x2y1=(y1−y2)x0+x1y2......(4)(x3−x4)y0+x4y3=(y3−y4)x0+x3y4......(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)

(x1​−x2​)y0​+x2​y1​=(y1​−y2​)x0​+x1​y2​......(4)(x3​−x4​)y0​+x4​y3​=(y3​−y4​)x0​+x3​y4​......(5)

至此问题变成了解出方程(4)和方程(5)组成的二元一次方程组。尝试采用消元的方式解出 x0x_0x0​ ,给方程(4)两边同时乘 (x3−x4)(x_3-x_4)(x3​−x4​) 得到方程(6),给方程(5)两边同时乘 (x1−x2)(x_1-x_2)(x1​−x2​) 得到方程(7):

(x1−x2)(x3−x4)y0+(x3−x4)x2y1=(x3−x4)(y1−y2)x0+(x3−x4)x1y2......(6)(x1−x2)(x3−x4)y0+(x1−x2)x4y3=(x1−x2)(y3−y4)x0+(x1−x2)x3y4......(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)

(x1​−x2​)(x3​−x4​)y0​+(x3​−x4​)x2​y1​=(x3​−x4​)(y1​−y2​)x0​+(x3​−x4​)x1​y2​......(6)(x1​−x2​)(x3​−x4​)y0​+(x1​−x2​)x4​y3​=(x1​−x2​)(y3​−y4​)x0​+(x1​−x2​)x3​y4​......(7)

用方程(6)减去方程(7)得到方程(8),即可得到 x0x_0x0​ 的解:

(x3−x4)(x2y1−x1y2)−(x1−x2)(x4y3−x3y4)=((x3−x4)(y1−y2)−(x1−x2)(y3−y4))x0...(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)

(x3​−x4​)(x2​y1​−x1​y2​)−(x1​−x2​)(x4​y3​−x3​y4​)=((x3​−x4​)(y1​−y2​)−(x1​−x2​)(y3​−y4​))x0​...(8)

由于轮换对称特性,将 x0x_0x0​ 表达式中的x全部换为y,y全部换为x即可得到 y0y_0y0​ 的解。

最终的解是:

x0=(x3−x4)(x2y1−x1y2)−(x1−x2)(x4y3−x3y4)(x3−x4)(y1−y2)−(x1−x2)(y3−y4)

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​=(x3​−x4​)(y1​−y2​)−(x1​−x2​)(y3​−y4​)(x3​−x4​)(x2​y1​−x1​y2​)−(x1​−x2​)(x4​y3​−x3​y4​)​

y0=(y3−y4)(y2x1−y1x2)−(y1−y2)(y4x3−y3x4)(y3−y4)(x1−x2)−(y1−y2)(x3−x4)

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​=(y3​−y4​)(x1​−x2​)−(y1​−y2​)(x3​−x4​)(y3​−y4​)(y2​x1​−y1​x2​)−(y1​−y2​)(y4​x3​−y3​x4​)​

当二者的分母为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]));

相关推荐