scipy.spatial.Voronoi计算的Voronoi区域是否为顺时针朝向
scipy.spatial.Voronoi区域边界顶点的环绕方向说明
结论:该接口返回的二维Voronoi闭合有限区域,边界顶点的默认环绕排列方向为逆时针,并非顺时针。
以下是具体说明和验证方法:
- 方向判定基准:上述结论基于标准数学二维坐标系(y轴向上)的环绕方向规则。如果你在可视化时使用了计算机图像领域常见的y轴向下坐标体系,视觉上看到的多边形环绕方向会呈现为顺时针,这是坐标系轴向翻转导致的视觉偏差,不是接口返回的顶点顺序本身有问题。
- 验证方法:你可以通过鞋带公式(Shoelace formula)计算多边形有向面积自行验证,对闭合多边形来说,顶点按逆时针排列时计算出的有向面积为正值,顺时针排列时为负值。简单验证代码如下:
import numpy as np from scipy.spatial import Voronoi # 生成随机二维测试点 points = np.random.rand(20, 2) vor = Voronoi(points) # 选取第一个无无穷远顶点的闭合有限区域 for region_id in vor.point_region: vert_ids = vor.regions[region_id] # 过滤包含无穷远顶点(标记为-1)的非完全闭合区域 if -1 not in vert_ids and len(vert_ids) >=3: poly = vor.vertices[vert_ids] # 鞋带公式计算有向面积 n = len(poly) signed_area = 0.5 * np.sum( poly[np.arange(n), 0] * poly[(np.arange(n)+1)%n, 1] - poly[(np.arange(n)+1)%n, 0] * poly[np.arange(n), 1] ) print(f"当前测试区域有向面积:{signed_area:.4f}") print("判定结果:", "逆时针排列" if signed_area > 0 else "顺时针排列") break
- 关于含无穷远边的区域:如果区域顶点列表中存在
-1标记,代表该位置对应无穷远处的虚拟顶点,这类开放区域的顶点排列逻辑和有限区域一致,但你需要自行根据vor.ridge_directions提供的方向向量补全无穷远边才能得到完整多边形,补全过程的方向处理错误会打乱整体环绕顺序,不属于接口返回顺序的问题。
内容的提问来源于stack exchange,提问作者TZDM
相关产品推荐
相关产品推荐

