2017-10-20 171 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) 
相关问题