2017-05-26 2 views
0

Connaissant le centre des deux rectangles et leur angle par axe x (axe horizontal), comment peut-on reconnaître si leur intersection est nulle ou non dans Matlab? Toute réponse contenant cette information est très appréciée. La largeur et la longueur des rectangles sont également connuesSi l'intersection de deux rectangles est zéro dans matlab

+2

C'est une question mathématique et non une question Matlab. –

+0

Mais je veux le résoudre par matlab @AnderBiguri Savez-vous ce que je peux faire? –

+1

Déterminez d'abord le problème mathématique, puis venez ici, décrivez-le et dites-nous quels sont les problèmes de programmation que vous rencontrez. J'écris mes calculs sur papier, mais je ne demande pas à une entreprise de papier de trouver des solutions parce que le fait que je le fasse en papier ne veut pas dire que c'est un problème de papier. Remplacer le papier par MATLAB. –

Répondre

0

Ceci est un problème de programmation si vous voulez le résoudre numériquement. Pour des solutions exactes, vous pouvez utiliser des équations géométriques.


Le premier problème: définir les coins d'un rectangle à partir de sa largeur, la hauteur et du centre:

C1 = [0, 0]; % Centre of rectangle 1 (x,y) 
C2 = [1, 1]; % Centre of rectangle 2 (x,y) 
W1 = 5; W2 = 3; % Widths of rectangles 1 and 2 
H1 = 2; H2 = 3; % Heights of rectangles 1 and 2 
% Define the corner points of the rectangles using the above 
R1 = [C1(1) + [W1; W1; -W1; -W1]/2, C1(2) + [H1; -H1; -H1; H1]/2]; 
R2 = [C2(1) + [W2; W2; -W2; -W2]/2, C2(2) + [H2; -H2; -H2; H2]/2]; 

problème suivant est de créer autant de points qui représentent les bords des rectangles. Vous pouvez générer plusieurs points au sein de les rectangles si vous voulez regarder les zones d'intersection.

n = 1000;  % Define some number of points to use 
% Use interp1 to interpolate around the rectangles 
R1points = interp1(1:5, [R1; R1(1,:)], linspace(1,5,n)); 
R2points = interp1(1:5, [R2; R2(1,:)], linspace(1,5,n)); 

Ensuite, tournez les rectangles:

a1 = deg2rad(0); a2 = deg2rad(30); % angles of rotation for rectangle 1 and 2 respectively 
R1rotated(:,1) = (R1points(:,1)-C1(1))*cos(a1) - (R1points(:,2)-C1(2))*sin(a1) + C1(1); 
R1rotated(:,2) = (R1points(:,1)-C1(1))*sin(a1) + (R1points(:,2)-C1(2))*cos(a1) + C1(2); 
R2rotated(:,1) = (R2points(:,1)-C2(1))*cos(a2) - (R2points(:,2)-C2(2))*sin(a2) + C2(1); 
R2rotated(:,2) = (R2points(:,1)-C2(1))*sin(a2) + (R2points(:,2)-C2(2))*cos(a2) + C2(2); 

Enfin, vérifiez intersection avec inpolygon:

in1 = inpolygon(R1rotated(:,1), R1rotated(:,2), R2rotated(:,1), R2rotated(:,2)); 
in2 = inpolygon(R2rotated(:,1), R2rotated(:,2), R1rotated(:,1), R1rotated(:,2)); 

Si nnz(in1)>0 ou nnz(in2)>0 alors vous avez une intersection! Visualisez en utilisant la diffusion:

hold on 
scatter(R2rotated(:,1), R2rotated(:,2), '.b') 
scatter(R2rotated(in2,1), R2rotated(in2,2), 'xc') 
scatter(R1rotated(:,1), R1rotated(:,2), '.r') 
scatter(R1rotated(in1,1), R1rotated(in1,2), 'xg') 

Résultat:

enter image description here

+0

Une réponse vraiment sympa, mais existe-t-il une façon plus simple de le faire sans rotation? –

+0

Vous dites dans la question que vous vouliez une rotation? Vous pouvez omettre les lignes de rotation ou définir 'a1' et' a2' sur 0 si vous voulez utiliser des rectangles orthogonaux aux axes – Wolfie

+0

Il y a des façons plus simples même avec la rotation. – Jed