如何用线切割简单的多边形

时间:2010-09-30 16:15:18

标签: geometry line polygon computational-geometry slice

我有一个简单的多边形(凸面或凹面,但没有孔),我需要切割成带有线段的部分。我不确定如何实际确定切片后多少个多边形结果,或者如何对顶点进行分组。

基本凸面情况总是导致2个子多边形很容易,但我如何处理复杂的凹形?以“E”形多边形为例。垂直切片可以产生4个多边形。如何确定哪些顶点构成每个子多边形?

定义多边形:我在这里有两个选项。我的多边形可以是有序的顶点列表,也可以是三角形数组。我更喜欢使用三角形数组的解决方案。循环遍历每个三角形并且如果它们相交则用线切割它应该非常容易。但后来我不知道如何将这些三角形分组为产生的子多边形。

伪代码甚至一般建议都是好的; C#实现是理想的。

2 个答案:

答案 0 :(得分:5)

我的库PolyK中有这个算法。这是the demo。如果您了解Javascript,我相信将其重写为您的编程语言会很容易。

答案 1 :(得分:3)

前段时间我给了this answer一个不同的问题。

该答案提供了一种建立形状轮廓的方法,给出了该形状的三角形分解。

基本思想是将所有三角形的边缘视为有向矢量,然后抵消相等但相反的边缘。

在你的情况下,你会有一堆三角形代表原始形状。您可以使用线切割单个三角形。然后,您可以使用上面概述的方法将三角形重新组合成形状,条件是切片边缘不会取消。

上面提到的答案中有详细信息和图片。但总结一下步骤

  1. 执行三角形分割

  2. 对于每个生成的三角形,将三个有向边添加到一个集合中。要确定顺时针顺序,请查看the the answers to this question

  3. 通过边集来删除相等但相反的边对(除非它们是切边)

  4. 在集合中选取一条边,然后找到其尾部与第一条边的头部匹配的边。然后重复该边缘,直到到达开始边缘。在到达时从边缘集中移除每个边缘。每当到达开始边缘时,您都会有一个表示结果多边形之一的闭环。

  5. 执行第4步,直到没有剩余边缘。

  6. 所有这些都适合您希望从多边形的三角测量开始。但正如您原始问题的一位评论者指出的那样,您可能需要考虑Generate new polygons from a cut polygon (2D)给出的替代方案。