求:线段分割多边形的算法

yingkoz 2009-03-05 12:17:52
给定一个任意形状的不自交、封闭多边形(包括凸的和凹的)和一条线段,
1.求线段和多边形的交点个数。
2.保存分割后形成的所有的多变形。

谁有和上面类似的算法啊,麻烦告诉一下,谢谢了!!!
...全文
1031 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
油焖大侠 2012-02-24
  • 打赏
  • 举报
回复
怎么按顶点顺序绕一圈啊?[Quote=引用 1 楼 dlyme 的回复:]
这个问题并不复杂,不需要什么特别的算法:
1.最简单的办法,依次判断给出的线段和多边形的n条边是否相加(判断两线段是否相交总会计算吧?高效一些的可以用跨立法),就可以得到交点的个数;
2.由于你给出的是“线段”,所以存在只有一个交点的特殊情况,这时多边形没有被分割。
如果交点个数在2个或2个以上:
a)对于凸多边形来说,最多就2个交点。此时多边形被这两个交点连成的线段分割成了两个小的凸多变……
[/Quote]
umlzhijia 2009-03-13
  • 打赏
  • 举报
回复
我最近写了两个图形∩∪差的算法,原理很简单,先把图形调整为逆时钟旋转,在交点处不断转换在不同边中行走,就可以找出∩∪的集合,差集时,在a-b 时,在a中逆时钟行走,b中顺时钟行走走出的结果集 就是差集了。
  • 打赏
  • 举报
回复
画一下图就很清楚了,其实就是这个意思:


swiftwqq 2009-03-10
  • 打赏
  • 举报
回复
我最近也在研究这个算法,讲一个复杂多边形切割成多个小多边形,切割之后的每个小多边形至少有一段、至多有两段“割线”来作为它的边?这个是一段还是两端的如何判断?
问dlyme兄,能否再讲的详细点,谢谢。
????
想象一下,将所有的顶点和交点按照顺时针(绕多边形顺时针绕一圈)的顺序围成一个大圆。
有效(原多边形内部)割线对应的交点之间用线段连起来,这些弦不会发生交叉。
圆怎么被切的,多边形就是怎样被切的,一样的道理~
????
ningyong58 2009-03-06
  • 打赏
  • 举报
回复
收藏
kon3155 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dlyme 的回复:]
对于凹多边形来说,情况要稍微复杂一点,因为交点连成的“割线”可能落在原来的多边形之外,需要对这种情况进行判断(判断两个交点的中点是否在原多边形内部,射线法、转角法...都可以)。然后按照顶点(包括交点)的顺序绕一圈,就可以得到分割后的所有多边形[/Quote]

“判断两个交点的中点是否在原多边形内部”,是那两个交点?按什么顺序的交点?像下面这个多边形被直线分割,可没那么简单啊!

  • 打赏
  • 举报
回复
想象一下,将所有的顶点和交点按照顺时针(绕多边形顺时针绕一圈)的顺序围成一个大圆。
有效(原多边形内部)割线对应的交点之间用线段连起来,这些弦不会发生交叉。
圆怎么被切的,多边形就是怎样被切的,一样的道理~
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kon3155 的回复:]
判断出内部和外部之后,怎么绕呢?如下图,怎么绕才能得到填充的多边形呢?
[/Quote]
注意切割之后的每个小多边形至少有一段、至多有两段“割线”来作为它的边。
假设有m段(在内部有效的)割线,原来的多边形就会被切成m+1块

图就不画了,这部分并不复杂,自己琢磨一下就清楚了~
  • 打赏
  • 举报
回复
把一个“回”字形的凹多边形一刀切成两半,看看是不是有段“割线”落在外面了?
你要求的是原来的多边形切割之后的被划分成的区域,总不能凭空多出一块来吧?
kon3155 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dlyme 的回复:]
然后按照顶点(包括交点)的顺序绕一圈,就可以得到分割后的所有多边形
[/Quote]

判断出内部和外部之后,怎么绕呢?如下图,怎么绕才能得到填充的多边形呢?
绿色夹克衫 2009-03-06
  • 打赏
  • 举报
回复
因为第二问不是要保存多边形么,在里面的就成为了多边形的新的边,在外面的就不是!

[Quote=引用 9 楼 yingkoz 的回复:]
引用 1 楼 dlyme 的回复:
b)对于凹多边形来说,情况要稍微复杂一点,因为交点连成的“割线”可能落在原来的多边形之外,需要对这种情况进行判断...

为什么要判断交点连成的“割线”是否落在多边形之外?
[/Quote]
yingkoz 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dlyme 的回复:]
b)对于凹多边形来说,情况要稍微复杂一点,因为交点连成的“割线”可能落在原来的多边形之外,需要对这种情况进行判断...
[/Quote]
为什么要判断交点连成的“割线”是否落在多边形之外?
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kon3155 的回复:]
“判断两个交点的中点是否在原多边形内部”,是那两个交点?按什么顺序的交点?像下面这个多边形被直线分割,可没那么简单啊!
[/Quote]
当然是按照射线的反向、判断射线上相邻两个交点的中点是在内部还是外部~
yingkoz 2009-03-06
  • 打赏
  • 举报
回复
不能沉啊!!!
绿色夹克衫 2009-03-05
  • 打赏
  • 举报
回复
就像1楼说的,依次求多边形的各个边同直线的交点,求交点可以用快斥法+跨立法(也是前两天刚学的!)
jlj84237485 2009-03-05
  • 打赏
  • 举报
回复
帮顶一下
yingkoz 2009-03-05
  • 打赏
  • 举报
回复
自己顶一下!

  • 打赏
  • 举报
回复 1
这个问题并不复杂,不需要什么特别的算法:
1.最简单的办法,依次判断给出的线段和多边形的n条边是否相加(判断两线段是否相交总会计算吧?高效一些的可以用跨立法),就可以得到交点的个数;
2.由于你给出的是“线段”,所以存在只有一个交点的特殊情况,这时多边形没有被分割。
如果交点个数在2个或2个以上:
a)对于凸多边形来说,最多就2个交点。此时多边形被这两个交点连成的线段分割成了两个小的凸多变形;
b)对于凹多边形来说,情况要稍微复杂一点,因为交点连成的“割线”可能落在原来的多边形之外,需要对这种情况进行判断(判断两个交点的中点是否在原多边形内部,射线法、转角法...都可以)。然后按照顶点(包括交点)的顺序绕一圈,就可以得到分割后的所有多边形。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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