Algorithm 是否有一种算法来分离共享一条边的多边形?

Algorithm 是否有一种算法来分离共享一条边的多边形?,algorithm,geometry,polygon,traversal,Algorithm,Geometry,Polygon,Traversal,我有一个定义多边形的顶点列表,一个连接这些顶点并定义多边形轮廓的周界边列表,以及一个连接顶点的内部边列表,有效地分割多边形。没有一条边彼此相交(它们仅在起点和终点相交) 我想通过在内部边缘将较大的多边形分割为较小的组件。基本上,我需要知道哪些顶点集是没有相交边的多边形的一部分 基本上,这是我掌握的信息: 顶点[0,1,3,5,7,9,11,13,15]定义多边形的外部周长,蓝色边(5,13)是将周长拆分为两个多边形的内部边。(忽略水平紫色线,它们是多边形梯形化以找到边(5,13)的结果。它们没

我有一个定义多边形的顶点列表,一个连接这些顶点并定义多边形轮廓的周界边列表,以及一个连接顶点的内部边列表,有效地分割多边形。没有一条边彼此相交(它们仅在起点和终点相交)

我想通过在内部边缘将较大的多边形分割为较小的组件。基本上,我需要知道哪些顶点集是没有相交边的多边形的一部分

基本上,这是我掌握的信息:

顶点[0,1,3,5,7,9,11,13,15]定义多边形的外部周长,蓝色边(5,13)是将周长拆分为两个多边形的内部边。(忽略水平紫色线,它们是多边形梯形化以找到边(5,13)的结果。它们没有进一步的意义)

这就是我想要达到的目标:

一个多边形由顶点[0,1,3,5,13,15]定义,另一个由[5,7,9,11,13]定义

我需要一个解决方案,任何数量的分裂内边缘工程。 最后,我希望能够像下面这样分割多边形:

子多边形不一定是凸的。这对于依赖于它的任何算法来说都可能很重要。例如,红色子多边形具有凹面顶点(13)

我最初的想法是顺时针或逆时针方向遍历每个子多边形的内部,跟踪遇到的顶点及其顺序。但是,我很难找到起始边/顶点,并且无法保证下一个cw或ccw点实际上位于我要提取的子多边形的内部

我试图用谷歌搜索解决方案,但这是一个我太不熟悉的数学领域,不知道该搜索什么。如能提供解决此问题的想法/算法,将不胜感激! (我不需要任何实际的代码,只要解释一下如何做,或者伪代码就足够了)

现在,不幸的是,我没有一些代码来显示,因为我需要一个概念来首先尝试。我不知道如何解决这个问题,因此无法编写任何可以完成我需要它完成的任务的代码

编辑:

这只是我最终要做的一步,那就是多边形三角剖分。我读过很多关于这个问题的解决方案,并希望通过梯形化来实现它,从而得到单调多边形并最终对其进行三角化。这基本上是梯形化的最后一步(或者我猜是之后的下一步),在我能找到的关于这个主题的任何参考资料中都没有解释过


梯形化的最终结果是内部边,这些边定义了拆分为(在我的例子中是垂直单调的)多边形。我只需要沿着这些边“数据结构”分割多边形,这样我就可以单独处理亚多边形了。我希望这有助于澄清问题。

您需要的算法的关键是了解如何对边进行排序:

按(逆)顺时针顺序找出下一条边 可以使用以下公式计算从节点i到节点j的边的绝对角度:

atan2(jy-iy, jx-ix)

边(i,j)和(j,k)之间的相对角度由下式给出:

atan2(ky-jy, kx-jx) - atan2(jy-iy, jx-ix)

此表达式可能会产生超出范围的角度[-首先,将形状视为图形并查找循环将获得所有子多边形,但它也将提供每个子多边形的组合。在循环查找路线中,可能有一种方法可以加快速度。问题陈述太模糊,无法给出答案。所有示例都显示将凹多边形拆分为最小数量凸多边形的r。这实际上就是你想要做的吗?详细说明前面的问题:你已经有了内边还是需要找到它们?@Gene I说“子多边形不一定是凸的。”。让我尝试用另一个示例结果来详细说明:我希望所有不同颜色的多边形都由一组周长点来描述。@NicoSchertler此时已知所有顶点和边。它们已在上一步中找到(请参见我的编辑)