从点和线获取矩形坐标

时间:2017-10-20 10:16:45

标签: matlab geometry coordinates

我的坐标为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;

2 个答案:

答案 0 :(得分:2)

您有[x1, y1][x2, y2]slope)之间的斜率以及[x3, y3]slopPerp)垂直线的斜率。

所以你对[x1, y1]行到[x2, y2]的y轴截距为

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

您还可以获得通过[x3, y3]

的垂直线的y轴截距
cPerp = y3 - slopePerp*x3;

然后,你的两条黑线相交的地方,我们称之为[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值存储在数组中而不是作为单独的变量可能更为简洁。

此外,没有理由使用round,它只会使结果不准确。如果要进行四舍五入是因为要显示值,请使用sprintf或将作为显示,而不是在计算之前。

答案 1 :(得分: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)