任何人都可以帮我解决如何在带有n个矩形障碍物的边界框区域中绘制空间的矩形吗?可以存在任意数量的轴平行矩形障碍物,这不是唯一的情况,因此需要考虑不同的角落情况。最好使用最大水平条带算法吗?如何?
问题描述:
1.SUB1和SUB2是障碍物,你不会触及SUB1和SUB2的内部,你需要找到所有SUB外部的所有空闲区域并从中创建矩形。
2.你需要在自由区域矩形上找到所有可能的矩形,从左到右扫描而不与SUB相交;
在这种情况下,最大水平空间矩形的总数应为7或一般为3n + 2(其中n为障碍物的数量): alt text http://img25.imageshack.us/img25/452/pic1gts.png
alt text http://img22.imageshack.us/img22/3417/pic2h.png
alt text http://img16.imageshack.us/img16/5818/pic3h.png
alt text http://img13.imageshack.us/img13/2151/pic4.png
点击查看图片: http://img25.imageshack.us/img25/452/pic1gts.png http://img22.imageshack.us/img22/3417/pic2h.png http://img16.imageshack.us/img16/5818/pic3h.png http://img13.imageshack.us/img13/2151/pic4.png
答案 0 :(得分:1)
您是在寻找最简单的算法,还是找到最佳分割矩形的算法?
从最简单的代码算法开始作为基线,这对于许多应用程序本身来说可能已经足够好了。这很容易编写和理解。
初始化您的矩形列表,只包括一个屏幕矩形。
现在,对于每个障碍物,遍历矩形列表。如果矩形与障碍物相交,则从列表中删除矩形并插入新的较小的矩形以避开障碍物。这是一个小的子问题,只需查看障碍物的哪个部分与矩形相交即可轻松解决。最终可能会有0,1,2,3或4个新的子矩形。 (考虑障碍物与一个角,两个角,所有角,没有角和没有边,没有角和1个边,没有角和2个边相交的六种情况。)
重复所有障碍物,并留下一个分开的矩形列表,覆盖您的区域而不会碰到障碍物。它不是最佳的,但它是一个好的起点和10分钟的代码。
答案 1 :(得分:0)
是的,我希望找到最佳的最小分割矩形。
我想对你的建议做一点澄清。 “初始化你的矩形列表,只包括一个,屏幕矩形”。
按屏幕矩形,是指外边界画布?然后,我在矩形列表中只有一个矩形。
“现在,对于每个障碍物,遍历矩形列表。如果矩形与障碍物相交,则从列表中删除矩形并插入新的较小的矩形以避开障碍物。”
为了继续上述步骤,我应该根据障碍物的每个共线边缘(4个边缘 - 左,右,顶部,底部)进行比较吗?意味着检查4个角点处的每个SUB1和SUB2边缘是否相互相交或是否与画布边界框相交。这是对的吗?
答案 2 :(得分:0)
角点拼接数据结构可以为您完成此操作。我不知道任何开源实现。最初的,或至少是规范的论文是Ousterhout(Tcl成名):http://www.eecs.berkeley.edu/Pubs/TechRpts/1983/6352.html