【问题标题】:How To Slice a Simple Polygon with a Line如何用一条线切割一个简单的多边形
【发布时间】:2011-04-19 10:57:53
【问题描述】:

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

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

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

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

【问题讨论】:

标签: geometry line polygon computational-geometry slice


【解决方案1】:

不久前,我向this answer 提出了一个稍微不同的问题。

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

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

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

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

  1. 执行三角形分割

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

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

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

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

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

【讨论】:

  • 不错的方法。不过,我仍然对实施它有点迷茫。你能提供一些细节吗?循环逻辑将如何运行? 1)取随机三角形A和B。2)将A的每一边与B匹配。3)如果任何边A +任何边B = 0,删除边?但是当我们处理 pionts 时,我如何删除一个边呢? 4) 现在我有一个正方形 C。我现在是否通过取正方形 C 与随机三角形 D 的并集来再次循环?然后我该如何移动到第二个子多边形?
  • @Liquid,你说的循环逻辑是什么意思?
  • 我必须实际编写一个循环,遍历数组中的每个三角形并进行您建议的所有比较。我需要最终将单个三角形数组拆分为切片后产生的许多多边形。
  • @Liquid,我添加了更多细节。您循环遍历多边形以创建边集,然后遍历边集以获取生成的多边形。
  • 谢谢!我想我现在唯一的问题是,如何将三角形数据转换为 3 个逆时针边?我有两个数组,一个包含每个多边形点的 x,y 顶点坐标。然后我有一个三角形数组,每个三角形都是映射到顶点数组的 3 部分名称。示例:Tri[0,1,2] 将指定多边形上的顶点 1、2 和 3,每个顶点都是具有 x 和 y 分量的 Vecto2。如何将其转换为逆时针边缘以进行边缘比较?
【解决方案2】:

我的库 PolyK 中有这个算法。这是the demo。如果你懂 Javascript,我相信用你的编程语言重写它会很容易。

【讨论】:

  • 嗨@Ivan Kuckir,它可以轻松地与谷歌地图一起使用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2015-04-28
  • 1970-01-01
相关资源
最近更新 更多