求两条直线的交点(附MATLAB完整代码)

求两条直线的交点,可以使用以下方法:

  1. 设两条直线的一般方程为:
    直线1: a1x + b1y + c1 = 0
    直线2: a2x + b2y + c2 = 0

  2. 消元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

  3. 解出x和y:
    x = (c2/b2 - c1) / (a1 + b1(-a2/b2))
    将x代入任一直线方程解出y

  4. 所以交点为:
    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

程序运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MATLAB代码顾问

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

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

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

打赏作者

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

抵扣说明:

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

余额充值