如何判断线段相交 – MATLAB中文论坛

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