我正在编写一个项目,您可以使用顶点和连接它们的线条绘制多边形,然后将它们运行到像pymunk这样的物理引擎中。
如果没有像这样完全连接
之下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是连接到该顶点的顶点列表 。如何在循环中将顶点列表连接起来
答案 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的定义,然后测试由Vertex
和Edges
表示的图表,即Vertex.pointsTo
是否构成一个强连接组件列表中的所有顶点。