在2D空间中,有一些矩形。它们会增长或缩小,有些会同时增长/缩小。当一个矩形增长时,它的左上角将永远不会移动,即只有底部或右边可以移动。
我们需要重新定位重叠的矩形。我们希望确保重新定位的2D空间在视觉上与前一个空间相似(即我们不应该对它们进行混洗,不应该引入不必要的空格,(如果可能的话)不应该更改每个矩形'最接近的矩形) 。
已知值:
如何有效地重新定位矩形?应该使用什么算法,以便通过一次操作可以解决一组碰撞(因为一些矩形可以很好地对齐并具有相同的大小)?我们如何根据坐标猜测相邻矩形之间的关系,并巧妙地重新定位它们。
一些例子:
left
和right
,而不是top
和bottom
。当{{ 1}}更改,left
重新定位,如下图所示。)当前解决方案
right
该解决方案在情况2中失败,因为小蓝色矩形的相对距离改变,但其大小不改变。底部两个矩形之间的距离不会为0.
答案 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)