Cómo determinar la intersección de segmentos de línea – Foro chino de MATLAB
borrar todo
clc
n=6
rp=rand(2,n); Genera n puntos aleatorios, aquí 5 seleccionado
y=rp(2,:);
x=rp(1,:);
L=[]matriz de líneas
h=1; contador
m=0; contador
er=1e-10 error de comparación, que se explicará más adelante
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) dibuja todas las líneas
espera p>
fin
fin
h=1;
si=tamaño(L); 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);
y21=L (l, 2);
x22=L(l, 3);
y22=L(l, 4); Extrae dos líneas de la matriz de líneas L
a1); =(y12-y11)/(x12-x11); Aquí usamos y1=a1*x1 b1, y2=a2*x2 b2 para representar dos líneas en el segmento 1, a1=(y12- y11)/(x12-). x11), b1=y11-x11*a1
b1=y11-x11*a1;
a2=(y22-y21)/(x22-x21 ); , 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 los dos segmentos de línea son infinitamente largos, xc=(b2-b1)/(a1-a2)
yc= a1*xc b1; donde yc es el valor y del punto de intersección de dos segmentos de línea si son infinitamente largos, yc=a1*xc b1
si x11gt se convierte en x11, x12, es decir Dos; los puntos en un segmento de línea se ordenan por tamaño
s=x11
x11=x12
x12=s
fin;
si x21gt;
Orden pequeña
s=x21
x21=x22
x22=s
fin
; if xc-x11gt;er &x12-xcgt;er&xc-x21gt;er &x22-xcgt;er ¿Es el punto de intersección de líneas infinitas en un segmento de línea
? (xc, yc, 'o') Si xc está incluido en dos segmentos de línea al mismo tiempo, entonces este punto es el punto de intersección
mantén presionado
mark(i)= i; El i-ésimo segmento de línea está marcado con un punto de intersección
mark(l)=l El l-ésimo segmento de línea está marcado con un punto de intersección
end; p>
fin
fin
nm=0;
Lm=[]; (1)
mark(i);
si mark(i)==0 no estará marcado, es decir, no habrá ninguna matriz sin intersección, registrada 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)];
dibujar línea(X, Y, 'color', 'rojo', 'LineWidth', 2) Todas las líneas p>
espera
Lm(nm,:)=[L(i,1) L(i,2) L(i,3) L(i,4 )]; p>
end
end
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 sin intersección< / p>
Lm