Cómo determinar la intersección de segmentos de línea – Foro chino de MATLAB
borrar todo
clc
n=6
rp=rand(2,n);%Generar n puntos aleatorios, El 5 seleccionados aquí
y=rp(2,:);
x=rp(1,:);
L=[]% línea Matriz
h=1;% contador
m=0;% contador
er=1e-10% de error de comparación, que se explicará más adelante p>
para i=1:n-1
h=h+1;
para l= h:n
m=m+ 1 ;
L(m,:)=[x(i) y(i) x(l) y(l)];% Conecta todos los puntos con rectas
X= [x(i) x(l)];
Y=[y(i) y(l)];
line(X,Y)% dibujar todas las líneas p>
espera
fin
fin
h=1;
si=size( L); p>
mark=zeros(1,si(1));% se utiliza para marcar la matriz con puntos de intersección
para i=1:m-1
h =h+1;
para l=h:m
x11=L(i,1);
y11=L(i, 2);
x12=L(i,3);
y12=L(i,4);
x21=L(l,1) ; p>
y21=L(l,2);
x22=L(l,3);
y22=L(l,4);% Extrae los dos líneas de la matriz de líneas L
a1=(y12-y11)/(x12-x11);%aquí y1=a1*x1+b1,y2=a2*x2+b2, para representar dos líneas, en el segmento de recta 1 a1=(y12-y11)/(x12-x11), b1=y11-x11*a1
b1=y11-x11*a1;
a2=( y22-y21)/(x22-x21);% En el segmento 2, a2=(y22-y21)/(x22-x21), b2=y21-x21*a2;
b2=y21- x21*a2;
xc=(b2-b1)/(a1-a2);% Aquí xc es el valor x del punto de intersección cuando dos segmentos de línea son infinitamente largos, xc= (b2-b1 )/(a1-a2)
yc=a1*xc+b1;% Aquí yc es el valor y del punto de intersección de dos segmentos de recta si son infinitamente largos, yc=a1*xc +b1
if x11>x12% Ordena x11, x12, es decir, los dos puntos de un segmento de recta según su tamaño
s=x11;
x11 = x12;
x12=s;
final
si x21>x22% ponga x21, x22, es decir, dos puntos en un segmento de recta según sus tamaño Ordenar
s=x21;
x21=x22;
x22=s;
>
end
if xc-x11>er && x12-xc>er && xc-x21>er && x22-xc>er% comparando el tamaño de xc con x11, x12, x21, x22 Relación para determinar si la intersección de esta línea infinita está en un segmento de línea,
plot(xc,yc,'o')% Si xc se incluye en dos segmentos de línea al mismo tiempo, entonces esto el punto es la intersección
mantenga presionado
mark(i)=i;%El i-ésimo segmento de línea está marcado con una intersección
mark(l) =l;%El l-ésimo segmento de línea está marcado Hay una intersección
end
end
end
nm=0 ;
Lm=[];
for i=1:si(1)
marca(i);
si marca (i) == 0% no se marcará, es decir, no hay una matriz sin puntos de intersección, que se registra en la matriz Lm y se muestra con una línea roja gruesa
nm=nm+1;
X=[L(i,1) L(i,3)];
Y=[L(i,2) L(i,4)];
line(X,Y,'color','red' ,'LineWidth',2)% dibuja todas las líneas
espera
Lm(nm,:) =[L(i,1) L(i,2) L (i,3) L(i,4)];
fin
fin
colnames={'Punto final del segmento de línea 1 sin intersección, x', 'Punto final del segmento de línea 1 sin intersección, y', 'Punto final del segmento de línea 2 sin intersección, x', 'Punto final del segmento de línea 2 sin intersección, y'};
t = uitable(Lm, colnames); %Utilice una tabla para escribir los segmentos de línea que no se cruzan
Lm