首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何判断一组物品是仅根据它们的位置水平地或垂直地堆放的?

如何判断一组物品是仅根据它们的位置水平地或垂直地堆放的?
EN

Software Engineering用户
提问于 2020-10-19 22:38:54
回答 2查看 262关注 0票数 -1

如何判断一组项目是水平堆叠还是垂直堆叠,只给出项目x和y的位置?

垂直组:

  • 项目1
  • 项目2
  • 项目3

横向组:

*项目1.项目2.项目3

垂直堆栈中的项可以向左或向右移动,但每个项都要从最后一个项向下移动。

水平堆栈中的项可以比第一项更高或更低。

我现在要做的是检查垂直堆栈,检查第二项Y位置是否大于第一项Y位置。但是,如果它是一组水平的项目,并且这些项目是从上到下的楼梯框,那么它就会失败。

代码语言:javascript
复制
    if (secondItemY>topY) {
        return true;
    }

我差点就知道了

更多信息:

项目可以是左的或者右的,第二项永远不会与第一项重叠。第二个项目的顶部位置将始终至少是前一个项目的顶部加上高度。项目之间可能有差距,也可能根本没有差距。项目可以是不同的大小。它们可以是不同的形状,但有矩形的边界。没有订单。

您可以考虑并将其作为组中网页上的项目列表进行测试。除了在网页上,你可以有负的项目之间的空白(我认为),在我的情况下,你不能。

更新:

如果我没有接受我自己的答案,直到我测试了它更多。我还想在其中添加一些示例,以显示它是否有效(是否有效)。

EN

回答 2

Software Engineering用户

发布于 2020-10-20 01:08:41

下面是看起来可行的方法。这是伪码:

  • 从第一个循环到最后循环每个项目。
  • 检查x或y在每一项之后是否增加
  • 如果y增加到最后一项,则它是垂直的(可能)。
  • 如果x增加到最后一项,那么它就不是垂直的(可能)
  • 前一步:如果它们都增加(楼梯),然后检查组的高度是否高于组的宽度(意为纵向或垂直布局)。
  • 编辑:当只有两个项目时,上面的内容就会失败。现在,如果两者都增加,检查两项之间的Y差是否大于X差。然后回到isPortrait()上。

这不是百分之百的傻瓜证明。如果你有一个正方形,并且每个项目都位于楼梯上,那么就无法判断它是垂直的还是水平的。

代码语言:javascript
复制
function isVerticalLayout(group) {
    var items = group.children;
    var numberOfItems = items.length;
    var secondItem = null;
    var item = null;
    var itemX = 0;
    var itemY = 0;
    var secondItemX = 0;
    var secondItemY = 0;
    var xGrows = true;
    var yGrows = true;

    if (numberOfItems>1) {

        // use a for loop to iterate from first to last item
        for (var i=numberOfItems-1;i>-1;i--) {
            item = items[i];
            secondItem = items[i-1];
        
            itemX = item.x;
            itemY = item.y;
        
            if (secondItem) {
                secondItemX = secondItem.x;
                secondItemY = secondItem.y;
            }
            else {
                continue; // is last item - exit
            }

            xOffset = secondItemX-itemX;
            yOffset = secondItemY-itemY;

            if (secondItemY>itemY) {

            }
            else {
                yGrows = false;
            }

            if (secondItemX>itemX) {

            }
            else {
                xGrows = false;
            }
        }
    
        // the rare and elusive stair-case layout
        if (xGrows && yGrows) {
            if (yOffset>xOffset) {
                return true;
            }

            return isPortrait(group); // is group height greater than width
        }

        // horizontal 
        if (xGrows) {
            return false;
        }
    
        // vertical
        if (yGrows) {
            return true;
        }
    }

    return false;
}
票数 0
EN

Software Engineering用户

发布于 2020-10-21 07:07:13

所以这些项目实际上是不重叠的矩形。如果它们的x坐标不重叠,你会认为它们是水平叠加的。

然后在伪代码中,会出现这样的情况:

代码语言:javascript
复制
bool are_items_horizontally_stacked( rectangle[] items )
{
   rectangle[] sortedrectangles = sort_by_min_x( items );
   for (int i = 0 to sortedrectangles.size()-2)
   {
     if (sortedrectangle[I].max_x > sortedrectangle[i+1].min_x)
       return false;
   }
   return true;
}
bool are_items_vertically_stacked( rectangle[] items )
{
   rectangle[] sortedrectangles = sort_by_min_y( items );
   for (int i = 0 to sortedrectangles.size()-2)
   {
     if (sortedrectangle[i].max_y > sortedrectangle[i+1].min_y)
       return false;
   }
   return true;
}

请注意,某些集合的项目既不能水平堆叠,也不能垂直堆叠,也不能同时堆叠(例如。以防它们对角对齐)。注意,一组0或1项总是被认为是水平和垂直叠加的。如果不打算这样做,那么请澄清所有这些情况的预期产出。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/418135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档