用matlab软件判断线段是否相交 50
用matlab软件判断线段是否相交现在已知有许多的平面直角坐标系的点坐标,我想确定一下这些点连接成线段后会有多少是不相交的。请求matlab语言描述。谢谢...
用matlab软件判断线段是否相交现在已知有许多的平面直角坐标系的点坐标,我想确定一下这些点连接成线段后会有多少是不相交的。
请求matlab语言描述。谢谢 展开
请求matlab语言描述。谢谢 展开
1个回答
展开全部
clear all
clc
n=6
rp=rand(2,n);%生成随机n个点,这里选的5个
y=rp(2,:);
x=rp(1,:);
L=[]%线矩阵
h=1;%计数器
m=0;%计数;器
er=1e-10%比较误差,后面会解释
for i=1:n-1
h=h+1;
for l= h:n
m=m+1;
L(m,:)=[x(i) y(i) x(l) y(l)];%将所有的点用线连起来
X=[x(i) x(l)];
Y=[y(i) y(l)];
line(X,Y)%画出所有的线
hold on
end
end
h=1;
si=size(L);
mark=zeros(1,si(1));%用来标记有交点的矩阵
for i=1:m-1
h=h+1;
for l=h:m
x11=L(i,1);
y11=L(i,2);
x12=L(i,3);
y12=L(i,4);
x21=L(l,1);
y21=L(l,2);
x22=L(l,3);
y22=L(l,4);%将两条线从L线矩阵里提取出来
a1=(y12-y11)/(x12-x11);%这里用y1=a1*x1+b1,y2=a2*x2+b2,来表示两条线,线段1里汪禅a1=(y12-y11)/(x12-x11),b1=y11-x11*a1
b1=y11-x11*a1;
a2=(y22-y21)/(x22-x21);%线段2里 a2=(y22-y21)/(x22-x21),b2=y21-x21*a2;
b2=y21-x21*a2;
xc=(b2-b1)/(a1-a2);%这里xc为两条线段无限长的情况下的相交点的x值, xc=(b2-b1)/(a1-a2)
yc=a1*xc+b1;%这里yc为两条线段无限长的情况下的相交点得y值, yc=a1*xc+b1
if x11>x12%把x11,x12,也就是一个线段上的两个点按照大小排序
s=x11;
x11=x12;
x12=s;
end
if x21>x22%把x21,x22,也就是一个线段上的两个点按照大小排序
s=x21;
x21=x22;
x22=s;
end
if xc-x11>er && x12-xc>er && xc-x21>er && x22-xc>er%通过比较xc与x11,x12,x21,x22的大小关系来判断这个无限长线的交点是否在线段里,
plot(xc,yc,'o')%如困衫尘果xc同时包含在两个线段里,那么这个点就是交叉点
hold on
mark(i)=i;%第i个线塌肆段被标记有交点
mark(l)=l;%第l个线段被标记有交点
end
end
end
nm=0;
Lm=[];
for i=1:si(1)
mark(i);
if mark(i)==0%将没有被标记,也就是没有没有交点的矩阵,记录在Lm矩阵里,并且用红色粗线显示出来
nm=nm+1;
X=[L(i,1) L(i,3)];
Y=[L(i,2) L(i,4)];
line(X,Y,'color','red','LineWidth',2)%画出所有的线
hold on
Lm(nm,:)=[L(i,1) L(i,2) L(i,3) L(i,4)];
end
end
colnames={'没有交点的线段端点1,x','没有交点的线段端点1,y','没有交点的线段端点2,x','没有交点的线段端点2,y'};
t = uitable(Lm, colnames);%用表格把没有相交的线段写出来
Lm
clc
n=6
rp=rand(2,n);%生成随机n个点,这里选的5个
y=rp(2,:);
x=rp(1,:);
L=[]%线矩阵
h=1;%计数器
m=0;%计数;器
er=1e-10%比较误差,后面会解释
for i=1:n-1
h=h+1;
for l= h:n
m=m+1;
L(m,:)=[x(i) y(i) x(l) y(l)];%将所有的点用线连起来
X=[x(i) x(l)];
Y=[y(i) y(l)];
line(X,Y)%画出所有的线
hold on
end
end
h=1;
si=size(L);
mark=zeros(1,si(1));%用来标记有交点的矩阵
for i=1:m-1
h=h+1;
for l=h:m
x11=L(i,1);
y11=L(i,2);
x12=L(i,3);
y12=L(i,4);
x21=L(l,1);
y21=L(l,2);
x22=L(l,3);
y22=L(l,4);%将两条线从L线矩阵里提取出来
a1=(y12-y11)/(x12-x11);%这里用y1=a1*x1+b1,y2=a2*x2+b2,来表示两条线,线段1里汪禅a1=(y12-y11)/(x12-x11),b1=y11-x11*a1
b1=y11-x11*a1;
a2=(y22-y21)/(x22-x21);%线段2里 a2=(y22-y21)/(x22-x21),b2=y21-x21*a2;
b2=y21-x21*a2;
xc=(b2-b1)/(a1-a2);%这里xc为两条线段无限长的情况下的相交点的x值, xc=(b2-b1)/(a1-a2)
yc=a1*xc+b1;%这里yc为两条线段无限长的情况下的相交点得y值, yc=a1*xc+b1
if x11>x12%把x11,x12,也就是一个线段上的两个点按照大小排序
s=x11;
x11=x12;
x12=s;
end
if x21>x22%把x21,x22,也就是一个线段上的两个点按照大小排序
s=x21;
x21=x22;
x22=s;
end
if xc-x11>er && x12-xc>er && xc-x21>er && x22-xc>er%通过比较xc与x11,x12,x21,x22的大小关系来判断这个无限长线的交点是否在线段里,
plot(xc,yc,'o')%如困衫尘果xc同时包含在两个线段里,那么这个点就是交叉点
hold on
mark(i)=i;%第i个线塌肆段被标记有交点
mark(l)=l;%第l个线段被标记有交点
end
end
end
nm=0;
Lm=[];
for i=1:si(1)
mark(i);
if mark(i)==0%将没有被标记,也就是没有没有交点的矩阵,记录在Lm矩阵里,并且用红色粗线显示出来
nm=nm+1;
X=[L(i,1) L(i,3)];
Y=[L(i,2) L(i,4)];
line(X,Y,'color','red','LineWidth',2)%画出所有的线
hold on
Lm(nm,:)=[L(i,1) L(i,2) L(i,3) L(i,4)];
end
end
colnames={'没有交点的线段端点1,x','没有交点的线段端点1,y','没有交点的线段端点2,x','没有交点的线段端点2,y'};
t = uitable(Lm, colnames);%用表格把没有相交的线段写出来
Lm
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询