如何判断一组项目是水平堆叠还是垂直堆叠,只给出项目x和y的位置?
垂直组:
横向组:
*项目1.项目2.项目3
垂直堆栈中的项可以向左或向右移动,但每个项都要从最后一个项向下移动。
水平堆栈中的项可以比第一项更高或更低。
我现在要做的是检查垂直堆栈,检查第二项Y位置是否大于第一项Y位置。但是,如果它是一组水平的项目,并且这些项目是从上到下的楼梯框,那么它就会失败。
if (secondItemY>topY) {
return true;
}我差点就知道了
更多信息:
项目可以是左的或者右的,第二项永远不会与第一项重叠。第二个项目的顶部位置将始终至少是前一个项目的顶部加上高度。项目之间可能有差距,也可能根本没有差距。项目可以是不同的大小。它们可以是不同的形状,但有矩形的边界。没有订单。
您可以考虑并将其作为组中网页上的项目列表进行测试。除了在网页上,你可以有负的项目之间的空白(我认为),在我的情况下,你不能。
更新:
如果我没有接受我自己的答案,直到我测试了它更多。我还想在其中添加一些示例,以显示它是否有效(是否有效)。
发布于 2020-10-20 01:08:41
下面是看起来可行的方法。这是伪码:
这不是百分之百的傻瓜证明。如果你有一个正方形,并且每个项目都位于楼梯上,那么就无法判断它是垂直的还是水平的。
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;
}发布于 2020-10-21 07:07:13
所以这些项目实际上是不重叠的矩形。如果它们的x坐标不重叠,你会认为它们是水平叠加的。
然后在伪代码中,会出现这样的情况:
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项总是被认为是水平和垂直叠加的。如果不打算这样做,那么请澄清所有这些情况的预期产出。
https://softwareengineering.stackexchange.com/questions/418135
复制相似问题