【问题标题】:Given four Corner vertices of a rectangle, how to identify all upper and lower (left & right) corner points?给定一个矩形的四个角顶点,如何识别所有上下(左右)角点?
【发布时间】:2015-10-13 07:17:36
【问题描述】:

给定变形矩形的四个角顶点,即p1(x1,y1),p2(x2,y2),p3(x3,y3)p4(x4,y4)

如何找到所有坐标的位置,即左上、右上、右下和左下?

我正在使用 MATLAB。

澄清:矩形不一定是轴对齐的。它可能会稍微倾斜。

【问题讨论】:

  • 例如左上坐标是y值最大、x值最小的坐标。这个问题和Matlab特别没有任何关系。
  • 我提到 MATLAB 认为可能有特殊功能可以做到这一点。
  • 你的矩形轴对齐了吗?即平行于 x 或 y 轴的边
  • @gregswiss:边缘不一定平行于任何轴。也可以平行或略微倾斜。
  • 这是一个 NumPy 实现 - stackoverflow.com/q/30088697/3293881

标签: arrays matlab vector rectangles


【解决方案1】:

您可以使用find 获取索引并使用& 运算符比较两个边界是否都满足。对轴对齐的矩形有效。

xP = [1 2 2 1];
yP = [3 1 3 1];

[~,right] = max(xP);
[~,left]  = min(xP);
[~,up]    = max(xP);
[~,low]   = min(yP);


upperleft  = intersect(up,left);
lowerright = intersect(low,right);

【讨论】:

  • 我假设一个轴对齐的矩形。否则,左上角没有明确定义。
  • 如果矩形不是轴对齐的,那么确实应该将角标签重命名为up/down/left/right,但找到更直接的方法:[~ up] = max(Yp)[~ down] = min(Yp) ... 等
  • @Hoki:如果 xP 或 yP 中的任何两个值相同,则此方法不起作用。
  • @user11659,好吧,如果 2 个值相同,那么您的矩形是 轴对齐的。所以在开始的时候检查一下这个条件,然后在此基础上使用 JaBe 的解决方案或我的扩展。
  • @Hoki:矩形不一定是轴对齐的。也可以平行或略微倾斜。由于我们正在研究通用解决方案,因此我们应该从顶点开始检查。
【解决方案2】:

这是我制定的解决方案。

fx=[x1 x2 x3 x4];  %represent x-cord
fy=[y1 y2 y3 y4];   %represent y-cord 
[xmn, ixmn]=min(fx);
fx(ixmn)=NaN;
[xmn2,ixmn2]=min(fx);
fx(ixmn)=xmn;   % to restore original data

if(fy(ixmn)>fy(ixmn2))
    ul=ixmn2; %upper-left
    ll=ixmn;  %lower left 
else
    ul=ixmn; 
    ll=ixmn2;
end
idd=setdiff(1:4,[ul ll]); 
if(fy(idd(1))>fy(idd(2)))
    ur=idd(2); %upper right
    lr=idd(1); %lower right
else
    ur=idd(1);
    lr=idd(2);
end

ul,ur ->fx,fy 中左上角和右上角的位置

ll,lr ->fx,fy 中左下角和右下角的位置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 2014-05-17
    • 2018-08-28
    • 2013-12-13
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多