在2D空间中排列扩展/缩小的矩形

时间:2017-04-11 13:12:24

标签: java algorithm

在2D空间中,有一些矩形。它们会增长或缩小,有些会同时增长/缩小。当一个矩形增长时,它的左上角将永远不会移动,即只有底部或右边可以移动。

我们需要重新定位重叠的矩形。我们希望确保重新定位的2D空间在视觉上与前一个空间相似(即我们不应该对它们进行混洗,不应该引入不必要的空格,(如果可能的话)不应该更改每个矩形'最接近的矩形) 。

已知值:

  • 空间大小
  • 两个相邻矩形之间的距离
  • 矩形的大小(更改前和更改后的大小)
  • 矩形的位置

如何有效地重新定位矩形?应该使用什么算法,以便通过一次操作可以解决一组碰撞(因为一些矩形可以很好地对齐并具有相同的大小)?我们如何根据坐标猜测相邻矩形之间的关系,并巧妙地重新定位它们。

一些例子:

  • 案例1:垂直增长/缩小(简单)
  • 案例2:水平增长/缩小(复杂。它假定有2个矩形组,leftright,而不是topbottom。当{{ 1}}更改,left重新定位,如下图所示。)
  • 案例3:横向增长/缩小(简单)

Examples

当前解决方案

right

该解决方案在情况2中失败,因为小蓝色矩形的相对距离改变,但其大小不改变。底部两个矩形之间的距离不会为0.

1 个答案:

答案 0 :(得分:0)

我尝试了几种方法(我已经考虑过这个问题大约一个多月了),我发现以下方法可能会更好。 我想我们必须知道矩形之间的关系(它们是如何分组的),以便使重新定位的矩形在视觉上类似于以前的版本。

// Use 2D array to represent the 2D space
ConstructRectangleGroups()
foreach (item in array) // item is the pixel in 2D space
    if (item contains more than 1 rectangles) // has collision
        foreach (rect in item's rectangles)
            get number of rect's grown/shrunk rows/columns
            foreach (rect2 in rectangleGroups[rectangleGroups.FindIndex(rect)])
                move rect2 according to the grown/shrunk rows
                if collision is solved after vertical movement
                    continue
                else
                    move horizontally

ConstructRectangleGroups()是

rectangleGroups = [][]
foreach (item in array)
    if (item has rectangle)
        closestRectangles = rectangle.GetClosestRectangles()
        // A rectangle is isolated if the distance between adjacent rectangle > MaxDistance
        // In this case, closestRectangles will be empty.
        if (closestRectangles.Count > 0)
            foreach (closestRectangle in closestRectangles)
                if (closestRectangle.ClosestRectangle != rectangle)
                    rectangle.ClosestRectangle = closestRectangle
            if (rectangle.closestRectangle == null)
                rectangle.ClosestRectangle = closestRectangles[0]
foreach (rect in rectangles)
    if (rect.ClosestRectangle == null)
        rectangleGroups.Add(new [] { rect })
    else
        index = rectangle.FindIndex(rect)
        if (index < 0)
            rectangleGroups.Add(new [] { rect })
        else
            rectangleGroups[index].Add(rect.ClosestRectangle)