2017-10-20 170 views
1

我的座標爲3點[x1,y1],[x2,y2][x3,y3],如下所示。從一個點和一條線獲取矩形座標

它們定義了矩形的一邊和位於矩形的平行/相反一側的點。我想獲得另外兩個角落的座標。

如何計算積分[xa, ya][xb, yb]如圖所示?

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

你有沒有想過你的第三個點的垂直投影在[與參考線成直角的距離]行上(https://stackoverflow.com/questions/28848406/distance-from-reference-line-at-right-angle/28867384#28867384)。一旦你有距離和交點,你幾乎完成。 – Irreducible

回答

2

你必須和斜率爲垂直線[x3, y3]slopPerp[x1, y1][x2, y2]slope)之間的斜率。

所以,你必須在y軸上的截距爲線[x1, y1][x2, y2]作爲

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

您也可以通過[x3, y3]

cPerp = y3 - slopePerp*x3; 

然後點垂直線的y軸截距你的兩條黑線相遇,我們稱之爲[x4,y4]

% 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; 

現在我們需要的是X和Y的差異

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

並把這些加入到我們的1個2分

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

image


注意,所有這些重複的動作,它可能會更整潔地將您的xy值存儲在數組中而不是分離e變量。

此外,沒有理由使用round,它只會使結果不準確。如果因爲要顯示值而四捨五入,請使用sprintf或使用作爲,而不是在計算之前顯示。

0

向量方法使用點P3的投影線P1P2和適用於矩形的任何旋轉(注意,斜率與軸對準的矩形並不存在)

P4 = P1 + (P2 - P1) * DotProduct(P3 - P1, P2 - P1)/DotProduct(P2 - P1, P2 - P1) 
    Pa = P1 + (P3 - P4) 
    Pb = P2 + (P3 - P4) 
相關問題