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

Liq*_*uid 6 geometry polygon line slice computational-geometry

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

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

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

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

Iva*_*kir 6

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


bra*_*jam 4

不久前,我对一个有些不同的问题给出了这个答案

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

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

在你的例子中,你会有一堆代表原始形状的三角形。您可以用线切割各个三角形。然后,您可以使用上面概述的方法将三角形重新聚集成形状,但切片边缘不会取消。

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

  1. 执行三角形分割

  2. 对于每个生成的三角形,将三个有向边添加到一个集合中。要确定顺时针顺序,请查看此问题的答案

  3. 遍历边缘集,删除相等但相反的边缘对(除非它们是切片边缘)

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

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

所有这些都满足您从多边形三角测量开始的愿望。但正如您最初问题的评论者之一所指出的那样,您可能需要考虑在从切割多边形 (2D) 生成新多边形中给出的替代方案。