求一算法 ,实现一个矩形和若干个不相交矩形的并集。
算法吧
全部回复
仅看楼主
level 2
有N个矩形互不相交,假设都放在A数组里,
现有任意的第N+1个矩形B,求B与A数组的并集,此并集用若干个互不相交的矩形表示。补充下,矩形是正交的,也就是说是平行于坐标轴的,没有旋转的。
任何语言实现都可以。
--------------------------------------
另外,对于C++里的CRgn这个类的内部实现,是怎样实现的?我觉得好神奇。
2013年04月17日 07点04分 1
level 4
遍历任意两个矩形的四个顶点,也就是八个顶点,找到x、y轴上的最小和最大值(xMin、xMax、yMin、yMax),然后组成并集矩形[(xMin, yMin), (xMin, yMax), (xMax, yMax), (xMax, yMin)],然后依次重复,直到最后只剩一个矩形。这个是最笨的方法了,应该可以优化。
2013年04月17日 14点04分 2
你误会我的意思了,我这里的并集是指绝对并集,有且只有矩形覆盖的区域,你这个算法是脏矩形算法。得到的是最小包围矩形。
2013年04月17日 14点04分
回复 风之语故乡 :你想怎么表示所有矩形覆盖的区域?试试二维数组吧,一个一个将矩形写入这个二维数组,二维数组元素只有0和1,写了1的就不再写了。
2013年04月17日 14点04分
回复 ashuralyk :这样说吧,假如A矩形和B矩形相交,那么至少得用3个不相交的矩形来表示这个并集区域。你想象一下,至于你说的那个什么0和1的,你跑题了。
2013年04月17日 14点04分
level 2
我来画张图:
2013年04月17日 15点04分 3
我自己想了一个及其复杂的算法,但感觉太不优美了,于是放弃。我先看看有没有人实现。注意哦,图里面的只是2个矩形,还算是比较容易实现,但如果是A矩形,和B,C同时相交,(B与C不相交)那么算法就复杂了,太费CPU
2013年04月17日 15点04分
level 9
有要求长方型个数最少么?
2013年04月18日 03点04分 4
level 9
我想到一种解决方案。
1,先将所有长方形抽象成X坐标相等的两条边,并赋予开始边和结束边的属性。
2,将以上边按X顺序排序,如果X相等则按Y逆序排序,得到队列。
3,从左端开始查找X最小的边(A),如果为结束边,则从队列中删除,并继续查找。
4,顺序查找下一条边(B)(X的值不相等)。
5,如果两条边在Y轴上的投影有所重叠,则得到一个长方形,X轴上为A.X~B.X,Y轴上的范围为A.Y1~A.Y2,保留。将B边分割成三段,如图:
得到C1,C2,C3,并抛弃与结束边投影相重合的部分(如果B为结束边,则删除C2,C3)从队列删除A边与B边,并将得到的边加入到原先B边的位置,然后继续重复3,直到队列以空。
以上这种方法对于中间镂空的情况都满足。。。。大概吧。。。
2013年04月18日 05点04分 5
http://zhidao.baidu.com/question/541535529?quesup2&oldq=1&sort=6 这是我的知道提问,来我给你分,[呵呵]
2013年04月18日 11点04分
回复 风之语故乡 :[Love]已解答,求加分。
2013年04月18日 13点04分
level 2
非常感谢,其实我想的也和你的这个有点类似,但我犯了一个很大的错误,我将边分解为点来分析,导致边之间的关联断裂,于是不得不做了很多修正措施。也导致分解出的矩形很多。我的错误就在于,没有很好的跟随人的直观思维,以后吸取教训。对了,你的这个思路还有一个问题没讲清楚,就是开始边和结束边的寻找问题。不过这个简单,我已搞定。总之一句话,谢谢你。
2013年04月18日 10点04分 6
[Love]不用谢,吧友之间相互帮助是应该的。
2013年04月18日 13点04分
1