2017-10-20 35 views
1

J'ai les coordonnées de 3 points [x1,y1], [x2,y2] et [x3,y3] comme indiqué ci-dessous.Obtenir les coordonnées d'un rectangle à partir d'un point et d'une ligne

Ils définissent la ligne qui est d'un côté d'un rectangle et un point qui se trouve sur le côté parallèle/opposé du rectangle. Je veux obtenir les coordonnées des deux autres coins.

Comment puis-je calculer les points [xa, ya] et [xb, yb] comme indiqué?

image

clc; 
clear; 

I = imread('peppers.png'); 
imshow(I); 
h = imline; 
lineEndPoints = wait(h); 

x1 = round(lineEndPoints(1,1),2); 
y1 = round(lineEndPoints(1,2),2); 
x2 = round(lineEndPoints(2,1),2); 
y2 = round(lineEndPoints(2,2),2); 
hold on 

[x3, y3] = ginput(1); 
plot(x3, y3,'b*'); 

slope = (y2 - y1)/ (x2 - x1); 
slopePerp = -1/slope; 
+0

Avez-vous pensé à la projection orthogonale de votre troisième point sur la ligne [Distance de la ligne de référence à angle droit] (https://stackoverflow.com/questions/28848406/distance-from-reference-line-at-right-angle/28867384#28867384). Une fois que vous avez la distance et le point d'intersection, vous avez presque terminé. – Irreducible

Répondre

2

Vous avez la pente entre [x1, y1] et [x2, y2] (slope) et la pente de la ligne perpendiculaire à [x3, y3] (slopPerp).

Vous avez donc l'ordonnée à l'origine pour la ligne [x1, y1]-[x2, y2] Vous pouvez également obtenir le

% From y=mx+c -> c=y-mx 
c = y1 - slope*x1; 

l'ordonnée à l'origine de la ligne perpendiculaire passant par [x3, y3]

cPerp = y3 - slopePerp*x3; 

Ensuite, le point où vos deux lignes noires se rencontrent, appelons-le [x4,y4] est

% Simultaneous equations 
% y = slope*x + c 
% y = slopePerp*x + cPerp 
% slope*x + c = slopePerp*x + cPerp 
% x*(slope - slopePerp) = cPerp - c 
x4 = (cPerp - c)/(slope - slopePerp); 
y4 = slope*x4 + c; 

Maintenant, tout ce dont nous avons besoin est les x et les différences y

xdiff = x3 - x4; % So x4 + xdiff = x3 
ydiff = y3 - y4; % So y4 + xdiff = y3 

Et pour ajouter à nos 1 et 2 points

xa = x1 + xdiff; 
ya = y1 + ydiff; 
xb = x2 + xdiff; 
yb = y2 + ydiff; 

image


Remarque, avec tous ces actions répétées il serait probablement plus facile de stocker vos valeurs x et y dans des tableaux plutôt que comme séparat e variables

En outre, il n'y a aucune raison d'utiliser round, cela ne rendra que le résultat moins précis. Si vous arrondissez parce que vous voulez afficher les valeurs, utilisez sprintf ou arrondissez comme et non avant les calculs.

0

approche Vector utilise la projection du point P3 sur la ligne P1P2 et travaille pour toute rotation du rectangle (notez que la pente n'existe pas pour le rectangle aligné axe-)

P4 = P1 + (P2 - P1) * DotProduct(P3 - P1, P2 - P1)/DotProduct(P2 - P1, P2 - P1) 
    Pa = P1 + (P3 - P4) 
    Pb = P2 + (P3 - P4)