检查所有顶点是否在循环中连接

时间:2017-05-14 10:40:54

标签: python pygame polygon

我正在编写一个项目,您可以使用顶点和连接它们的线条绘制多边形,然后将它们运行到像pymunk这样的物理引擎中。

我想确保所有顶点都像这样连接在一个循环中 enter image description here

如果没有像这样完全连接

enter image description here
每个顶点都是Vertex对象,位于

之下
class Vertex():
    def __init__(self, id, position, pointsTo = [], rectSize = [10, 10]):
        self.id = int(id)
        self.position = tuple(position)
        self.rect = tuple((position[0], position[1], rectSize[0], rectSize[1]))
        self.pointsTo = list(pointsTo)

    def setPosition(self, position):
        self.position = tuple((position[0] - (self.rect[2] / 2), position[1] - (self.rect[3] / 2)))
        self.rect = tuple((self.position[0], self.position[1], self.rect[2], self.rect[3]))

    def getRect(self):
        return self.rect

其中pointsTo是连接到该顶点的顶点列表 。如何在循环中将顶点列表连接起来

2 个答案:

答案 0 :(得分:1)

如果我们将其视为图形,我们有顶点,而pointsTo是边的邻接列表。我也基于问题中的图示假设无向图,因此如果A-> B则B-> A。我们可以将多边形视为N循环。我忽略了屏幕上边缘交叉的可能性,图中没有实际的顶点。

假设它是一个N循环。然后每个顶点都有两条边,并且所有顶点都是连通的。这两个都很容易测试。

(注意:如果每个顶点都有两条边,那么你已经连接起来了。连接测试只是为了看多个多边形,或者只是一个,并且使证明更容易。请参阅https://en.wikipedia.org/wiki/Seven_Bridges_of_K%C3%B6nigsberg对于类似的概念。正如那个着名的问题所示,你可以测试偶数,如果你允许多个多边形,但只是想测试没有链接到多边形的额外线。)

现在,假设图形通过了上述测试 - 假设,从任何一点开始并开始访问图形后面的点到顶点,从不使用先前访问过的边/顶点。每次你访问一个新的顶点时,它都是你第一次到达那里,因此你不能在该顶点使用其他pointsTo,所以你可以继续直到你的顶点用完为止。那时,你有两个未使用的点 - 一个进入起始顶点,一个进入结束顶点。要么他们指向一个不存在的顶点,要么指向彼此,这意味着它是一个N周期。

因此证明了上述测试。

我说测试很容易,所以我应该这样做:要测试图表是否已连接,请参阅https://en.wikipedia.org/wiki/Connectivity_(graph_theory)

将访问标志(初始化为false)添加到所有顶点。选择任何顶点,然后开始访问邻居。当你用完时,看看是否有任何顶点没有被访问过。

或制作一组vertex.id,在访问时添加它们。最后,检查len(该集合)是图表中的顶点数量

答案 1 :(得分:0)

您需要查看Strongly Connected Component的定义,然后测试由VertexEdges表示的图表,即Vertex.pointsTo是否构成一个强连接组件列表中的所有顶点。