Python 确定顶点是否位于一组顶点内

Python 确定顶点是否位于一组顶点内,python,graph,networkx,image-segmentation,vertices,Python,Graph,Networkx,Image Segmentation,Vertices,在我的算法中,我找到不同阈值的图。每个图G=(V,E)。这些是使用广度优先搜索发现的无向图。我想确定另一个图G'=(V',E')的顶点是否位于图G内。我不熟悉图算法,因此请告诉我您是否想查看代码或更详细的解释 例如,如果我有一个图G1,它是一个具有{(1,1),(1,6),(6,6),(6,1)}的“角点”顶点的正方形(除其他外,但为了简单起见减少),那么由角点{(2,2),(2,5),(5,5),(5,2)}定义的较小的正方形G2将位于G1内。第三个图G3由角点{(3,3)、(3,4)、(4,

在我的算法中,我找到不同阈值的图。每个图G=(V,E)。这些是使用广度优先搜索发现的无向图。我想确定另一个图G'=(V',E')的顶点是否位于图G内。我不熟悉图算法,因此请告诉我您是否想查看代码或更详细的解释

例如,如果我有一个图G1,它是一个具有{(1,1),(1,6),(6,6),(6,1)}的“角点”顶点的正方形(除其他外,但为了简单起见减少),那么由角点{(2,2),(2,5),(5,5),(5,2)}定义的较小的正方形G2将位于G1内。第三个图G3由角点{(3,3)、(3,4)、(4,4)、(4,3)}定义。我的算法为此配置生成下图:

阈值为2的正方形,由t=1包围,由t=0包围。(我需要修复边,但顶点是正确的)

我的算法适用于以下矩阵:

import numpy as np

    A = np.zeros((7,7))
    #A[A<1] = -1
    for i in np.arange(1,6):
        for j in np.arange(1,6):
            A[i,j] = 1
    for i in np.arange(2,5):
        for j in np.arange(2,5):
            A[i,j] = 2
    for i in np.arange(3,4):
        for j in np.arange(3,4):
            A[i,j] = 3
    print(A)
和边缘列表:

e1 = [[[2.25, 3.0], [3.0, 2.25]], [[3.0, 3.75], [2.25, 3.0]], [[3.0, 2.25], [3.75, 3.0]], [[3.0, 3.75], [3.75, 3.0]]]
e2 = [[[1.333333, 2.0], [2.0, 1.333333]], [[1.333333, 3.0], [1.333333, 2.0]], [[1.333333, 4.0], [1.333333, 3.0]], [[2.0, 4.666667], [1.333333, 4.0]], [[2.0, 1.333333], [3.0, 1.333333]], [[2.0, 4.666667], [3.0, 4.666667]], [[3.0, 1.333333], [4.0, 1.333333]], [[3.0, 4.666667], [4.0, 4.666667]], [[4.0, 1.333333], [4.666667, 2.0]], [[4.666667, 3.0], [4.666667, 2.0]], [[4.666667, 4.0], [4.666667, 3.0]], [[4.0, 4.666667], [4.666667, 4.0]]]
e3 = [[[0.5, 1.0], [1.0, 0.5]], [[0.5, 2.0], [0.5, 1.0]], [[0.5, 3.0], [0.5, 2.0]], [[0.5, 4.0], [0.5, 3.0]], [[0.5, 5.0], [0.5, 4.0]], [[1.0, 5.5], [0.5, 5.0]], [[1.0, 0.5], [2.0, 0.5]], [[1.0, 5.5], [2.0, 5.5]], [[2.0, 0.5], [3.0, 0.5]], [[2.0, 5.5], [3.0, 5.5]], [[3.0, 0.5], [4.0, 0.5]], [[3.0, 5.5], [4.0, 5.5]], [[4.0, 0.5], [5.0, 0.5]], [[4.0, 5.5], [5.0, 5.5]], [[5.0, 0.5], [5.5, 1.0]], [[5.5, 2.0], [5.5, 1.0]], [[5.5, 3.0], [5.5, 2.0]], [[5.5, 4.0], [5.5, 3.0]], [[5.5, 5.0], [5.5, 4.0]], [[5.0, 5.5], [5.5, 5.0]]] 
同样,这给出了如下图形

这是我正在研究的真实数据。更复杂的形状

例如,在这里,我有一个红色的形状在一个绿色的形状里面。理想情况下,红色形状将位于红色形状中。它们将被组合在一个对象中(比如一个图形数组)

这些图形以顺时针方式连接。我真的不知道如何描述它,但也许链接中的图表显示了这一点。其中两条线上有一个bug(正如您在右上角的第一个图中所看到的),但是顶点是正确的


希望这有帮助!我可以附上一个完整的可行的例子,但它将包括我的整个算法和网页长,与许多功能!我基本上希望使用g1、g2和g3输入函数(或e1、e2和e3)。函数会告诉我g3包含在g2中,g2包含在g1中。

您的问题实际上与网络无关。从根本上说,您试图确定点是否位于有序点列表所描述的区域内。最简单的方法是创建matplotlib
Path
,它有一个
contains_point
方法(还有一个“contains_points”方法可以同时测试多个点)


请注意,如果点直接位于路径上,则它不在路径内。但是,
contains_point
支持一个
radius
参数,该参数允许您向区域范围添加增量。是否需要正增量或负增量取决于点的顺序。IIRC,
radius
沿路径方向向左移动路径,但不要引用我的话

嗯,这看起来很容易完成任务。在这里我认为这是不可行的。。。关于半径参数,你是说弄乱它(正或负)会让我“包含”一些顶点共享的图吗?另外,我之所以使用networkx标记,是因为我很好奇使用该模块是否会打开以后的分析途径。>关于半径参数,你是说,弄乱它(正或负)会允许我“包含”与某些顶点共享的图形吗?<是的,这正是我想说的。>我想知道,当我们进入三维空间时,这是否成立路径只能定义一个平面,所以不,这在3D中不起作用(除非第三个维度无关紧要)。它起作用了!我遇到了一件事:当我确定,是的,g3位于g1内,我想把g1和g3以及位于g1内的任何其他子图g_I一起分组。我可以使用什么数据结构?我现在正在尝试集合,但我认为这行不通。路径是点的有序集合(顺序很重要!),所以不能简单地组合不同的路径。然而,你们可以有一个查找表(dict),它告诉你们g_i中的点意味着,当g_i被g_j完全包围时,点也在g_j中。
e1 = [[[2.25, 3.0], [3.0, 2.25]], [[3.0, 3.75], [2.25, 3.0]], [[3.0, 2.25], [3.75, 3.0]], [[3.0, 3.75], [3.75, 3.0]]]
e2 = [[[1.333333, 2.0], [2.0, 1.333333]], [[1.333333, 3.0], [1.333333, 2.0]], [[1.333333, 4.0], [1.333333, 3.0]], [[2.0, 4.666667], [1.333333, 4.0]], [[2.0, 1.333333], [3.0, 1.333333]], [[2.0, 4.666667], [3.0, 4.666667]], [[3.0, 1.333333], [4.0, 1.333333]], [[3.0, 4.666667], [4.0, 4.666667]], [[4.0, 1.333333], [4.666667, 2.0]], [[4.666667, 3.0], [4.666667, 2.0]], [[4.666667, 4.0], [4.666667, 3.0]], [[4.0, 4.666667], [4.666667, 4.0]]]
e3 = [[[0.5, 1.0], [1.0, 0.5]], [[0.5, 2.0], [0.5, 1.0]], [[0.5, 3.0], [0.5, 2.0]], [[0.5, 4.0], [0.5, 3.0]], [[0.5, 5.0], [0.5, 4.0]], [[1.0, 5.5], [0.5, 5.0]], [[1.0, 0.5], [2.0, 0.5]], [[1.0, 5.5], [2.0, 5.5]], [[2.0, 0.5], [3.0, 0.5]], [[2.0, 5.5], [3.0, 5.5]], [[3.0, 0.5], [4.0, 0.5]], [[3.0, 5.5], [4.0, 5.5]], [[4.0, 0.5], [5.0, 0.5]], [[4.0, 5.5], [5.0, 5.5]], [[5.0, 0.5], [5.5, 1.0]], [[5.5, 2.0], [5.5, 1.0]], [[5.5, 3.0], [5.5, 2.0]], [[5.5, 4.0], [5.5, 3.0]], [[5.5, 5.0], [5.5, 4.0]], [[5.0, 5.5], [5.5, 5.0]]] 
#!/usr/bin/env python
"""
Determine if a point is within the area defined by a path.
"""
import numpy as np
import matplotlib.pyplot as plt

from matplotlib.path import Path
from matplotlib.patches import PathPatch

point = [0.5, 0.5]
vertices = np.array([
    [0, 0],
    [0, 1],
    [1, 1],
    [1, 0],
    [0, 0] # NOTE the repetition of the first vertex
])

path = Path(vertices, closed=True)

print(path.contains_point(point))
# True

# plot to check visually 
fig, ax = plt.subplots(1,1)
ax.add_patch(PathPatch(path))
ax.plot(point[0], point[1], 'ro')