如何用Python判断图中顶点是否位于指定子图的内部或外部?
判断平面图中节点是否在指定子图围成的内部区域
要实现这个需求是可行的,但核心依赖于图的平面嵌入以及点-in-多边形的几何判断逻辑——你说的“内部/外部”本质是平面图嵌入后,子图(闭合环)围成的面的内外区域。以下是具体的Python实现思路和代码示例:
关键前提
- 你的图
gee必须是平面图(能在平面上无交叉绘制),否则不存在明确的“内部/外部”定义; - 子图
subgee必须是一个简单闭合环(比如你例子中的[2,3,4]构成环),否则无法围成明确的区域。
实现步骤
1. 验证平面图并获取平面嵌入坐标
用networkx库处理图结构,先验证平面性,再生成平面嵌入的节点坐标:
import networkx as nx from shapely.geometry import Point, Polygon # 假设你的图gee已构建完成,此处用示例图替代 gee = nx.Graph() gee.add_edges_from([(1,2), (2,3), (3,4), (4,2), (2,5), (5,7), (4,5), (1,4)]) # 验证是否为平面图 is_planar, embedding = nx.check_planarity(gee) if not is_planar: raise ValueError("图不是平面图,无法判断内部/外部区域") # 生成平面布局坐标(planar_layout更适配平面图的无交叉特性) pos = nx.planar_layout(gee)
2. 提取子图的闭合环坐标
以子图subgee = gee.subgraph([2,3,4])为例,先确定环的顺序(确保首尾闭合),再提取对应坐标:
sub_nodes = [2,3,4] # 获取子图的环结构 sub_cycle = nx.find_cycle(gee.subgraph(sub_nodes)) # 整理环的节点顺序并确保首尾闭合 cycle_nodes = [u for u, v in sub_cycle] if cycle_nodes[0] != cycle_nodes[-1]: cycle_nodes.append(cycle_nodes[0]) # 生成环的坐标列表 cycle_coords = [pos[node] for node in cycle_nodes] # 创建多边形对象用于区域判断 sub_polygon = Polygon(cycle_coords)
3. 判断所有非子图节点的位置
遍历原图中不在子图的节点,用shapely判断节点是否在多边形内部:
inner_nodes = [] outer_nodes = [] for node in gee.nodes(): if node in sub_nodes: continue point = Point(pos[node]) # 判断点是否在多边形内部(排除边界上的节点) if sub_polygon.contains(point): inner_nodes.append(node) else: outer_nodes.append(node) print("子图内部的节点:", inner_nodes) print("子图外部的节点:", outer_nodes)
注意事项
- 如果子图不是闭合环,需先处理成闭合的边界结构,否则无法生成有效判断区域;
- 平面布局的坐标精度会影响判断结果,
nx.planar_layout()相比其他布局更适合平面图的坐标生成; - 若图存在多种平面嵌入方式,不同嵌入可能导致内部/外部节点的判断结果不同,需确保使用你实际需要的嵌入方式。
内容的提问来源于stack exchange,提问作者jlewis
相关产品推荐
相关产品推荐

