Geometry 如何用直线分割简单多边形

Geometry 如何用直线分割简单多边形,geometry,line,polygon,computational-geometry,slice,Geometry,Line,Polygon,Computational Geometry,Slice,我有一个简单的多边形(凸面或凹面,但没有孔),我需要用线段将其分割成多个部分。我不确定如何实际确定切片后产生多少多边形,或者如何对顶点进行分组 基本的凸面情况总是产生2个子多边形是很容易的,但是我如何处理复杂的凹面形状呢?以“E”形多边形为例。垂直切片可以生成4个多边形。如何确定构成这些子多边形的每个顶点 定义多边形:这里有两个选项。我的多边形可以是顶点的有序列表,也可以是三角形的数组。我更喜欢使用三角形数组的解决方案。在每个三角形之间循环,如果它们相交,用直线将其切分,应该是非常容易的。但是我

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

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

定义多边形:这里有两个选项。我的多边形可以是顶点的有序列表,也可以是三角形的数组。我更喜欢使用三角形数组的解决方案。在每个三角形之间循环,如果它们相交,用直线将其切分,应该是非常容易的。但是我不知道如何将这些三角形组合成子多边形

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

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

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

基本概念是将所有三角形的边视为有向矢量,然后抵消相等但相对的边。< /P> 在您的例子中,将有一组三角形表示原始形状。你可以用这条线来分割各个三角形。然后,您将使用上面概述的方法将三角形重新聚集成形状,附带条件是切片边不会取消

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

  • 执行三角形分割

  • 对于每个生成的三角形,将三条定向边添加到一个集合中。要确定顺时针顺序,请检查

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

  • 在集合中拾取一条边,然后查找尾部与第一条边的头部匹配的边。然后对该边重复,直到到达起始边。到达边缘集时,将其从边缘集中删除。无论何时到达起始边,都有一个表示结果多边形之一的闭合环

  • 执行步骤4,直到没有剩余边缘


  • 所有这些都满足了您从多边形的三角剖分开始的愿望。但是,正如你最初的问题中的一个评论家指出的,你可能想考虑在.< /P> < P>中的选择。我在我的库中有这个算法。这是。如果您理解Javascript,我相信将其改写为您的编程语言会很容易。

    这有什么帮助吗?好办法。不过,我对实现它还是有点迷茫。你能提供一些细节吗?循环逻辑将如何运行?1) 随机选取三角形A和B。2)将A的每一侧与B匹配。3)如果任意一侧A+任意一侧B=零,则移除该一侧?但是,当我们处理PIONT时,如何去掉一个边?4) 现在我有了一个正方形C。我现在可以通过取正方形C和随机三角形D的并集来再次循环吗?然后我如何继续第二个子多边形?@Liquid,你所说的循环逻辑是什么意思?我必须写一个循环,它贯穿数组中的每个三角形,并进行你所建议的所有比较。我需要最终将单个三角形阵列分割为切片后产生的多边形数。@Liquid,我已经添加了更多细节。通过多边形循环创建一个边集,然后通过边集运行以获得结果多边形。谢谢!我想我现在唯一的问题是,如何将三角形数据转换成3条逆时针方向的边?我有两个数组,一个是每个多边形点的x,y顶点坐标。然后我有一个三角形数组,每个三角形是一个由三部分组成的名称,映射到顶点数组。示例:Tri[0,1,2]将指定多边形上的顶点1、2和3,每个顶点都是带有x和y分量的向量2。我如何将其转换为逆时针方向的边来进行边比较?嗨@Ivan Kuckir,它可以轻松地与谷歌地图一起工作吗?