當前位置:歷史故事大全網 - 範文作文 - 如何判斷線段相交 – MATLAB中文論壇

如何判斷線段相交 – 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

  • 上一篇:清東陵是誰盜挖的
  • 下一篇:法國 舊制度時期的階級,土地,手工業
  • copyright 2024歷史故事大全網