matlab编程求两条直线的交点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab编程求两条直线的交点相关的知识,希望对你有一定的参考价值。

网上搜了程序,可是看不懂,谁能帮忙一下呢??将下边语句详细解释一下。非常感谢了!

---------------------------------网上找的,不太给力的代码-----------------------------------------
function [X Y]=node(X1,Y1,X2,Y2)
k1=(Y1(2)-X1(2))/(Y1(1)-X1(1));
k2=(Y2(2)-X2(2))/(Y2(1)-X2(1));
b1=X1(2)-k1*Y1(1);
b2=X2(2)-k2*Y2(1);
X=(b2-b1)/(k1-k2);
Y=k1*X+b1;
A1=Y1(1)-Y1(2);
B1=X1(2)-X1(1);
C1=Y1(2)*X1(1)-Y1(1)*X1(2);
A2=Y2(1)-Y2(2);
B2=X2(2)-X2(1);
C2=Y2(2)*X2(1)-Y2(1)*X2(2);
D=det([A1,B1;A2,B2]);
X=det([-C1 B1;-C2 B2])/D
Y=det([A1 -C1;A2,-C2])/D
----------------------------------------华丽的分割线-------------------------------------------
以下为在网上寻找代码未果后,个人带着失望与不屑书写的Matlab代码:
---------------------------------------个人给力代码-----------------------------------------
function [X Y]= node( X1,Y1,X2,Y2 )
if X1(1)==Y1(1)
X=X1(1);
k2=(Y2(2)-X2(2))/(Y2(1)-X2(1));
b2=X2(2)-k2*X2(1);
Y=k2*X+b2;
end
if X2(1)==Y2(1)
X=X2(1);
k1=(Y1(2)-X1(2))/(Y1(1)-X1(1));
b1=X1(2)-k1*X1(1);
Y=k1*X+b1;
end
if X1(1)~=Y1(1)&X2(1)~=Y2(1)
k1=(Y1(2)-X1(2))/(Y1(1)-X1(1));
k2=(Y2(2)-X2(2))/(Y2(1)-X2(1));
b1=X1(2)-k1*X1(1);
b2=X2(2)-k2*X2(1);
if k1==k2
X=[];
Y=[];
else
X=(b2-b1)/(k1-k2);
Y=k1*X+b1;
end
end
----------------------------------------华丽的分割线-------------------------------------------

参考技术A 不知楼主的两条直线是知道数据呢还是方程?
给力代码不是靠看得懂看不懂来评判的。而是运行效率才是第一位,简单明了是第二位。你网上找的,没有用到一个循环,执行效率必然你的好。是给力代码噢! 
注:Matlab忌讳循环。

追问

这个,是某个网站上的。
知道每条直线的两个端点

追答端点数据呢?

追问

随便啊。4个点嘛。(x1,y1)与(x2,y2)。只要告诉我上边人家写的,每个步骤什么意思就成

POJ 1269 /// 判断两条直线的位置关系

题目大意:

t个测试用例 每次给出一对直线的两点

判断直线的相对关系

平行输出NODE 重合输出LINE 相交输出POINT和交点坐标

 

1.直线平行 两向量叉积为0

2.求两直线ab与cd交点

设直线ab上点为 a+(b-a)t,t为变量

交点需满足在直线cd上 则(d-c)*(a+t(b-a)-c)=0(外积)

分解为加减式 将t放在等号左边 其他放在右边

化简推导得t=(d-c)*(c-a)/(d-c)*(b-a)

则交点为a+(b-a)*((d-c)*(c-a)/(d-c)*(b-a))

技术分享图片
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cmath>
using namespace std;

const double eps=1e-10;
double add(double a,double b) {
    if(abs(a+b)<eps*(abs(a)+abs(b))) return 0;
    return a+b;
}
struct P {
    double x,y;
    P(){};
    P(double _x,double _y):x(_x),y(_y){}
    P operator - (P p) {
        return P(add(x,-p.x),add(y,-p.y)); }
    P operator + (P p) {
        return P(add(x,p.x),add(y,p.y)); }
    P operator * (double d) {
        return P(x*d,y*d); }
    double dot(P p) {
        return add(x*p.x,y*p.y); }
    double det(P p) {
        return add(x*p.y,-y*p.x); }
}p;
struct L {
    P a,b;
    L(){};
    L(P _a,P _b):a(_a),b(_b){};
}l1,l2;
int n;

P ins(P a,P b,P c,P d)  {
    return a+(b-a)*((d-c).det(c-a)/(d-c).det(b-a));
}
int solve()
{
    if((l1.a-l1.b).det(l2.a-l2.b)==0) { // 平行
        return (l1.a-l2.b).det(l1.b-l2.b)==0;
    } // 若l2有一点在l1上 就是重合
    p=ins(l1.a,l1.b,l2.a,l2.b); // 相交求交点
    return -1; 
}

int main()
{
    while(~scanf("%d",&n)) {
        printf("INTERSECTING LINES OUTPUT
");
        for(int i=0;i<n;i++) {
            scanf("%lf%lf%lf%lf"
                  ,&l1.a.x,&l1.a.y,&l1.b.x,&l1.b.y);
            scanf("%lf%lf%lf%lf"
                  ,&l2.a.x,&l2.a.y,&l2.b.x,&l2.b.y);
            int t=solve();
            if(t==0) printf("NONE
");
            else if(t==1) printf("LINE
");
            else printf("POINT %.2f %.2f
",p.x,p.y);
        }
        printf("END OF OUTPUT
");
    }
}
View Code

 

以上是关于matlab编程求两条直线的交点的主要内容,如果未能解决你的问题,请参考以下文章

matlab中如何求两直线交点?

matlab中怎么求两曲线交点

MATLAB中怎么求两条曲线的交点并标注

怎么在matlab里面求已有两条曲线的交点?

matlab如何判断两条线段是不是相交

请问如何用matlab求两条曲线的误差??