Algorithm 从直线骨架中提取的最小圆基

Algorithm 从直线骨架中提取的最小圆基,algorithm,computational-geometry,Algorithm,Computational Geometry,我正在尝试实现一个算法,该算法可以找到下面形状给出的外部多边形的每个单独边的对应区域。也就是说,1,2边的对应面积是[1,6,7,8,2],边2,3的面积是[2,8,3],依此类推,CCW或CW在这里不是问题。这里要详细说明的是,黑色粗体线是外部多边形,内部蓝色虚线是给定外部多边形的直骨架,我无法控制内部节点编号方案,这意味着从左到右的节点可以是8,7,6或6,8,7或7,6,8等。。 在谷歌搜索了几天之后,我发现Floyd Warshall算法与最小循环基的结合就是这种技术的一种,可以用来提

我正在尝试实现一个算法,该算法可以找到下面形状给出的外部多边形的每个单独边的对应区域。也就是说,1,2边的对应面积是[1,6,7,8,2],边2,3的面积是[2,8,3],依此类推,CCW或CW在这里不是问题。这里要详细说明的是,黑色粗体线是外部多边形,内部蓝色虚线是给定外部多边形的直骨架,我无法控制内部节点编号方案,这意味着从左到右的节点可以是8,7,6或6,8,7或7,6,8等。。

在谷歌搜索了几天之后,我发现Floyd Warshall算法与最小循环基的结合就是这种技术的一种,可以用来提取所需的最小循环图,我认为我至少走在了正确的道路上,请确认

我遵循Ferreira Manuel J.Fonseca Joaquim a.Jorge在“从一组线Alfredo中检测多边形”术语中给出的说明

以下伪代码用于提取最小循环路径

***MINIMUM-CYCLE-BASIS(G)***
1 Γ ← empty set
2 Π ← ALL-PAIRS-SHORTEST-PATHS(G)
3 for each v in VERTICES(G)
4 do for each (x, y) in EDGES(G)
5 do if Π x,v ∩ Π v,y = {v}
6 then C ← Π x,v ∪ Π v,y ∪ (x, y)
7 add C to Γ
8 ORDER-BY-LENGTH(Γ)
9 return SELECT-CYCLES(Γ)
  • 在第二行**∏← 全对最短路径(G)**是Floyd-Warshall算法,该算法将用所有最短路径分析∏。但是有些路径将不需要计算,例如我不需要,并且在2,4-7,5-1,7之间有任何直接关系,等等。。顶点
  • 发起人在第5行和第6行检查条件的意思是如果∏x,v∩ π_v,y={v}然后C← πx,v∪ πv,y∪ (x,y),根据给定的伪代码片段,∏的内容结构必须是2D数组,该数组保持给定距离的最短距离,例如,∏[2,7]=顶点的长度(2,7)。那么在∏x,v中有横坐标和顶点的意义是什么,它真正代表什么

谢谢

我建议一种更简单的方法。从任何外边缘开始,比如P1->P2。然后检查连接到P2的每个节点PX,并选择角度(P1、P2、PX)具有最小正值的节点。该节点PX是多边形中的下一个节点。然后继续查找连接到PX的节点PY,其中角度(P2,PX,PY)具有最小的正值
有几种可能的方法来计算角度。其中之一是:

c = inner_product( P1-P2, PX-P2 ) / ( abs(P1-P2) * abs(PX-P2) ) # cosine of the angle
s = cross_product( P1-P2, PX-P2 ) / ( abs(P1-P2) * abs(PX-P2) ) # sine of the angle
angle = atan2( s, c ) # arc tangent with correct sign
与:

小心标志,它取决于CW和CCW。当然,您可以省略规范化术语(
abs…
),因为它们相互抵消。
如果允许凹多边形,则必须重新规格化反正切的结果,以确保角度始终为正:

def atan2_normalized( y, x ):
    angle = atan2( y, x )
    if angle < 0:
        return angle + 2 * Pi
    else:
        return angle
def atan2_标准化(y,x):
角度=atan2(y,x)
如果角度<0:
返回角+2*Pi
其他:
返回角

非常感谢您,这确实是一种实用的方法,尽管从逻辑上讲,它看起来完全正确,但您是否100%确定即使外部多边形是凹的,最小角度的情况也会在迭代中给出下一个点?是的,在这种情况下,符号问题一直困扰着我,但至少我有一个起点。对,我没有考虑凹多边形。我扩展了答案,也包括了这些。100%确定,想想看:如果PX不是多边形中的下一个点,那么一定有一个点PX'是多边形中的下一个点,PX'的角度一定比PX小。凹面或凸面并不重要,只要你确保角度始终为正。到目前为止,五边形的建议效果很好,我还没有测试所有的情况,但可以接受作为答案。我仍然想知道发起者在MCB算法“if∏x,v”中的条件检查是什么意思∩ π_v,y={v}然后C← πx,v∪ πv,y∪ (x,y),“有人能解释一下吗?
def atan2_normalized( y, x ):
    angle = atan2( y, x )
    if angle < 0:
        return angle + 2 * Pi
    else:
        return angle