我试图自己解决这个问题,但是我尝试的所有方法都没有完全奏效。我不确定这是否是一个数学问题(因为它与语言无关),但我首先会在这里问。
我有一组矩形形状:x、y、宽度、高度。我想要能够对这些对象进行排序,使它们在等距投影时“相互在背后”。
编辑:x和y坐标表示每个矩形的“左下”角。
这是一个具有以下属性的对象示例:x = 0,y = 0,width = 2,height = 1
对象可以是任何大小的矩形(不仅限于我示例中显示的矩形)。角度并不重要,让我们假设为45°。
我尝试查看Cavalier Projection和类似的主题-但是如何实际对这些对象进行排序的信息使我困惑不解。
我可以使用哪种排序算法对这些对象进行排序并获得正确的顺序?
编辑1:使用@Stef的建议(将“<”更改为“<=”)适用于大多数情况,但是一旦添加了更多对象,就会出现这种情况:
// Stef's suggestion, slightly modified
compareRectangles(r1, r2):
return ((r1.x + r1.width <= r2.x) OR (r1.y+r1.height <= r2.y))
我之前在做这个尝试的时候也遇到了这个问题。增加或减少其他盒子可能会改变结果。我不确定这是否是sort()的问题,还是与对象之间的距离太“远”有关(因此当“长”对象相互切割时,排序突然不再起作用)。
通常,对象越“方形”,错误就越少。但我正在尝试找到即使使用长矩形也能正常工作的解决方案。
编辑2: 这里是上述示例失败的坐标。遗憾的是,这种组合有点脆弱...添加更多的盒子只会导致故障出现在不同的随机位置。总组合似乎影响结果,而不是每个单独的比较。
x, y, width, height
===================
0, 4, 4, 4
0, 8, 8, 1
4, 4, 4, 2
8, 4, 1, 7
6, 6, 1, 1
5, 6, 1, 1
4, 6, 1, 1
8, 11, 1, 1
0, 2, 9, 1
0, 1, 9, 1
0, 0, 9, 1
11, 7, 1, 1
11, 8, 1, 1
11, 9, 1, 1
11, 10, 1, 1
11, 11, 1, 1
0, 10, 1, 1
0, 11, 1, 1
1, 10, 1, 1
1, 11, 1, 1
2, 10, 1, 1
2, 11, 1, 1
0, 3, 11, 1 // long box above failing box
9, 1, 1, 1 // failing box