求两条直线的交点,可以使用以下方法:
-
设两条直线的一般方程为:
直线1: a1x + b1y + c1 = 0
直线2: a2x + b2y + c2 = 0 -
消元x和y,可以得到:
a1x + b1y + c1 = 0
a2x + b2y + c2 = 0
=> a1x + b1(−a2/b2)x - c2/b2 + c1 = 0
=> x(a1 + b1(-a2/b2)) = c2/b2 - c1 -
解出x和y:
x = (c2/b2 - c1) / (a1 + b1(-a2/b2))
将x代入任一直线方程解出y -
所以交点为:
X = (c2/b2 - c1) / (a1 + b1(-a2/b2))
Y = (−b1/a1)X - c1/a1
MATLAB代码如下:
main.m主程序:
%% 求两条直线的交点
clc;clear all;close all;
%% (1)设置数据
Line1Node1=[0.5,3];%直线1的第1个点[x11,y11]
Line1Node2=[3,0];%直线1的第2个点[x12,y12]
Line2Node1=[1,0.1];%直线2的第1个点[x21,y21]
Line2Node2=[4,4];%直线2的第2个点[x22,y22]
%% (2)调用计算交点的函数进行计算
[crossX,crossY]= LinesIntersection( Line1Node1,Line1Node2,Line2Node1,Line2Node2 );%调用计算交点的函数进行计算
%% (3)输出交点
crossX
crossY
子函数LinesIntersection代码:
function [crossX,crossY]= LinesIntersection( Line1Node1,Line1Node2,Line2Node1,Line2Node2)
%% 计算交点的函数
%% 输入数模
% Line1Node1=[0.5,3];%直线1的第1个点
% Line1Node2=[3,0];%直线1的第2个点
% Line2Node1=[1,0.1];%直线2的第1个点
% Line2Node2=[4,4];%直线2的第2个点
%% 输出数据
% crossX=交点x坐标
% crossY=交点y坐标
if Line1Node1(1)==Line1Node2(1)%% 直线1 斜率为无穷大的情况
Slope2=(Line2Node2(2)-Line2Node1(2))/(Line2Node2(1)-Line2Node1(1));
b2=Line2Node1(2)-Slope2*Line2Node1(1);
crossX=Line1Node1(1);
crossY=Slope2*crossX+b2;
elseif Line2Node1(1)==Line2Node2(1)%% 直线2斜率为无穷大的情况
Slope1=(Line1Node2(2)-Line1Node1(2))/(Line1Node2(1)-Line1Node1(1));
b1=Line1Node1(2)-Slope1*Line1Node1(1);
crossX=Line2Node1(1);
crossY=Slope1*crossX+b1;
else %% 其他情况:(Line1Node1(1)~=Line1Node2(1)) && (Line2Node1(1)~=Line2Node2(1))%
Slope1=(Line1Node2(2)-Line1Node1(2))/(Line1Node2(1)-Line1Node1(1));
Slope2=(Line2Node2(2)-Line2Node1(2))/(Line2Node2(1)-Line2Node1(1));
b1=Line1Node1(2)-Slope1*Line1Node1(1);
b2=Line2Node1(2)-Slope2*Line2Node1(1);
if Slope1==Slope2%如果平行,无交点
crossX='平行无交点';
crossY='平行无交点';
else
crossX=(b2-b1)/(Slope1-Slope2);%根据斜率和截距计算交点的x值
crossY=Slope1*crossX+b1;%根据斜率和截距计算交点的y值
end
end
程序运行结果: