6

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

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

定义多边形:我有两个选择。我的多边形可以是一个有序的顶点列表,也可以是一个三角形数组。我更喜欢使用三角形数组的解决方案。遍历每个三角形并在它们相交时将其与线切割应该很容易。但后来我不知道如何将这些三角形分组到产生的子多边形中。

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

4

2 回答 2

8

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

于 2014-05-21T14:56:17.483 回答
4

不久前,我对一个稍微不同的问题给出了这个答案。

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

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

在您的情况下,您将有一堆代表原始形状的三角形。您将用线切割各个三角形。然后,您将使用上述方法将三角形重新组合成形状,但前提是切片边缘不会取消。

上面提到的答案中有细节和图片。但总结这些步骤将是

  1. 执行三角分割

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

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

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

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

所有这些都满足了您从多边形三角剖分开始的愿望。但正如您原来问题的一位评论者所指出的那样,您可能需要考虑Generate new polygons from a cut polygon (2D)中给出的替代方案。

于 2010-09-30T17:14:29.773 回答