把不规则多边形分割成矩形的问题

bdxxxx 2011-11-07 04:56:43
有一个由多个矩形重叠成的不规则图形,要重新分割成多个矩形不重叠组成的图形,求思路或者算法,自己写了很多次不是太麻烦就是太局限就是考虑不周到。。。

分割的结果类似下图

...全文
1769 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
caozl 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 bdxxxx 的回复:]
引用 11 楼 caozl 的回复:

如果任一分法都可以的话 是不是这样认为呢
既然是由多个矩形重叠成的不规则图形 那就一个一个的把矩形给累加上去
两个矩形的并结果最多可以分成三个矩形。然后再把下一个矩形与这些结果分别做并。

两个矩形有重叠部分 最一般的结果不是3个矩形,而是一个矩形和2个L型多边形
[/Quote]
我的意思并不是求交 而是指X轴方向或Y轴方向上切开并运算的结果 这样可以得到3个矩形吧
然后就是不断的添加矩形与当前存在的矩形去运算。把运算结果取出再重新添加
bdxxxx 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 caozl 的回复:]

如果任一分法都可以的话 是不是这样认为呢
既然是由多个矩形重叠成的不规则图形 那就一个一个的把矩形给累加上去
两个矩形的并结果最多可以分成三个矩形。然后再把下一个矩形与这些结果分别做并。
[/Quote]
两个矩形有重叠部分 最一般的结果不是3个矩形,而是一个矩形和2个L型多边形
caozl 2011-11-10
  • 打赏
  • 举报
回复
如果任一分法都可以的话 是不是这样认为呢
既然是由多个矩形重叠成的不规则图形 那就一个一个的把矩形给累加上去
两个矩形的并结果最多可以分成三个矩形。然后再把下一个矩形与这些结果分别做并。
caozl 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 bdxxxx 的回复:]
引用 14 楼 caozl 的回复:

我对这个问题的基本思路是:
定义CRECT类 在这个类里有一个方法:
bool CRECT::AddRect(CRect&amp; rect, std::vector<CRect>&amp; rectResults);
当两个矩形相交或者可以合并为一个矩形的时候,这个方法返回true, 并把合并的结果传出

输入为一个std::……
[/Quote]

不需要整理 因为
bool CRECT::AddRect(CRect& rect, std::vector<CRect>& rectResults);
当两个矩形相交或者可以合并为一个矩形的时候,这个方法返回true, 并把合并的结果传出

如果生成的矩形可以和相邻的矩形合并的话 在添加进结果数组的时候就会合并了。
peterormike 2011-11-10
  • 打赏
  • 举报
回复
沿着凹点分割,递归处理。以9楼的图形为例:
http://hi.csdn.net/attachment/201111/10/2530173_1320907025RRCC.jpg
bdxxxx 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 caozl 的回复:]

我对这个问题的基本思路是:
定义CRECT类 在这个类里有一个方法:
bool CRECT::AddRect(CRect& rect, std::vector<CRect>& rectResults);
当两个矩形相交或者可以合并为一个矩形的时候,这个方法返回true, 并把合并的结果传出

输入为一个std::vector<CRect> rectInput;
输出为……
[/Quote]

应该是可以 但是这会导致分块越来越小,矩形越来越多,还需要在分成小块之后进行整理
caozl 2011-11-10
  • 打赏
  • 举报
回复
我对这个问题的基本思路是:
定义CRECT类 在这个类里有一个方法:
bool CRECT::AddRect(CRect& rect, std::vector<CRect>& rectResults);
当两个矩形相交或者可以合并为一个矩形的时候,这个方法返回true, 并把合并的结果传出

输入为一个std::vector<CRect> rectInput;
输出为一个std::vector<CRect> rectOutput;
把rectInput里的矩形分别与rectOutput中的矩形做AddRect运算 如果返回TRUE 就把返回的结果给push_back到rectInput的后面。并把rectOutput中的这个矩形给删除。
bdxxxx 2011-11-09
  • 打赏
  • 举报
回复
呃 看来没人有兴趣啊
laviewpbt 2011-11-07
  • 打赏
  • 举报
回复
利用WINDOWS的GDI函数GetRegionData 的话可以得到如下的四个矩形。

  • 打赏
  • 举报
回复
不要瞎出主意了 典型的图形学2维几何(可以中空-有孔) 运算(并)问题
用户 昵称 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bdxxxx 的回复:]
引用 2 楼 jennyvenus 的回复:

可不可以这样

把边界的线段提取出来,一定要提取到最短的线段,不能再分,然后找共有线段。

然后判断如果没有共有线段的话,某个矩形是不是一个矩形


这个样子分出来的矩形是不是太小了。。。
[/Quote]

不知道啊,俺所能想像的就是这个了
bdxxxx 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jennyvenus 的回复:]

可不可以这样

把边界的线段提取出来,一定要提取到最短的线段,不能再分,然后找共有线段。

然后判断如果没有共有线段的话,某个矩形是不是一个矩形
[/Quote]

这个样子分出来的矩形是不是太小了。。。
bdxxxx 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bhybhybhy2 的回复:]

查 图形学 2维图形的几何运算
代码到cgal里面找
[/Quote]

多谢
bdxxxx 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happyparrot 的回复:]

你所画的只是一个很简单的特例,能选择的拆分方法只有一种。而对于复杂的重叠情况,可能能够满足条件的拆分方法并不止一种,你如何要求哪种是正确的,或者任何一种都可以呢?
[/Quote]

我画的却是是很简单的,实际情况是还有可能是中空的, 满足拆分条件的都任一分法都可以

  • 打赏
  • 举报
回复
查 图形学 2维图形的几何运算
代码到cgal里面找
用户 昵称 2011-11-07
  • 打赏
  • 举报
回复
可不可以这样

把边界的线段提取出来,一定要提取到最短的线段,不能再分,然后找共有线段。

然后判断如果没有共有线段的话,某个矩形是不是一个矩形
快乐鹦鹉 2011-11-07
  • 打赏
  • 举报
回复
你所画的只是一个很简单的特例,能选择的拆分方法只有一种。而对于复杂的重叠情况,可能能够满足条件的拆分方法并不止一种,你如何要求哪种是正确的,或者任何一种都可以呢?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧