我找指针以下问题的解答:我有一组矩形,其高度是已知的,X位置也和我想收拾他们在更紧凑的形式。 随着一点点的图纸(其中所有的矩形宽度相同,但宽度可以在现实生活中会发生变化),我想,而不是。
-r1-
-r2--
-r3--
-r4-
-r5--
就像是。
-r1- -r3--
-r2-- -r4-
-r5--
所有的线索将不胜感激。 我不一定要找“的”最佳解决方案。
我找指针以下问题的解答:我有一组矩形,其高度是已知的,X位置也和我想收拾他们在更紧凑的形式。 随着一点点的图纸(其中所有的矩形宽度相同,但宽度可以在现实生活中会发生变化),我想,而不是。
-r1-
-r2--
-r3--
-r4-
-r5--
就像是。
-r1- -r3--
-r2-- -r4-
-r5--
所有的线索将不胜感激。 我不一定要找“的”最佳解决方案。
你的问题是一个简单的变体,但你可能会得到一些提示阅读的“binpacking”问题开发启发式。 目前已经写了这个有很多,但这个页面是一个良好的开端。
TopCoder的有竞争来解决这个问题的3D版本。 获奖者讨论他的做法在这里 ,它可能是你的一个有趣的阅读。
是矩形都是一样的高度? 如果是这样,而问题只是把它排在每个矩形,那么问题归结为一系列在所有对形式的矩形(X,Y)的约束“矩形X不能在同一行中矩形Y”时矩形X在x方向重叠,矩形Y.
这方面的一个“贪婪的”算法排序矩形从左到右,再依次到最低编号排在它适合给每个矩形。 因为矩形被从左至右处理,一个只需要担心当前矩形的左手边缘是否将重叠的任何其它的矩形,这在某种程度上简化重叠检测算法。
我不能证明这是给出了最佳的解决方案,但在另一方面也想不出任何反例的副手任。 任何人?
像这样的事情?
写检查该矩形是存在于x轴的一定的时间间隔的方法
Collection<Rectangle> overlaps (int startx, int endx, Collection<Rectangle> rects){ ... }
环比矩形的集合
Collection<Rectangle> toDraw; Collection<Rectangle> drawn; foreach (Rectangle r in toDraw){ Collection<Rectangle> overlapping = overlaps (rx, r.x+r.width, drawn); int y = 0; foreach(Rectangle overlapRect in overlapping){ y += overlapRect.height; } drawRectangle(y, Rectangle); drawn.add(r); }
将一个类似俄罗斯方块的游戏到你的网站。 产生落在块,并根据你的paramters播放区域的大小。 奖分玩家根据自己设计的紧凑性(较少的可用空间=更多点)。 让你的网站访客执行工作适合你。
我以前的一个问题像这样工作。 最直观的图片可能是一个地方的大矩形是在底部,而较小的放在最上面,有点像把它们放在一个容器中,并摇晃它,因此重的人落到底部。 因此,要做到这一点,首先在降低区域(或宽度)进行排序的阵列 - 我们会第一时间处理大项目,建设图片上爬起来。
现在的问题是,以y坐标分配给一组矩形,其x坐标给出,如果我理解正确的。
遍历您的矩形阵列。 对于每个矩形,初始化通过增加此矩形的y轴坐标,直到它不与任何先前放置的矩形相交的矩形的y坐标为0,然后循环(你需要跟踪哪些矩形此前已放置)。 提交到y坐标你刚才发现,并继续处理下一个矩形。