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