三维ℝ³中Voronoi胞元的完全邻居期望数求解及推导疑问
问题分析与解决
1. 原代码的问题
vor.ridge_points统计的是所有共享面的Voronoi邻居,对应三维泊松Voronoi图中胞元面数的期望E(F)≈14.28,这和你观察到的结果一致。而完全(Gabriel)邻居需要满足更严格的条件:
两个生成元u、v是完全邻居,当且仅当以u、v连线为直径的球内不含其他任何生成元(等价于连线与公共面相交)。
2. 修正后的实证代码
以下脚本在统计邻居的基础上,添加Gabriel邻居的判断逻辑:
import numpy as np from scipy.spatial import Voronoi import matplotlib.pyplot as plt points = np.random.rand(1000, 3) vor = Voronoi(points) # 初始化完全邻居字典 complete_neighbors = {i: [] for i in range(len(points))} for simplex in vor.ridge_points: i, j = simplex u = points[i] v = points[j] # 计算u-v的中点和半径平方 midpoint = (u + v) / 2 radius_sq = np.sum((u - v)**2) / 4 # 检查所有其他点是否在以uv为直径的球内 has_other_point = False for k in range(len(points)): if k == i or k == j: continue dist_sq = np.sum((points[k] - midpoint)**2) if dist_sq < radius_sq: has_other_point = True break # 若没有其他点在球内,则为完全邻居 if not has_other_point: complete_neighbors[i].append(j) complete_neighbors[j].append(i) # 统计完全邻居数量并计算均值 complete_counts = [len(ns) for ns in complete_neighbors.values()] average_complete = np.mean(complete_counts) print(f"完全邻居期望数实证值:{average_complete:.2f}") # 绘制直方图 plt.figure() plt.hist(complete_counts, bins=range(min(complete_counts), max(complete_counts)+2,1), edgecolor='black') plt.xlabel("Complete Neighbour Count") plt.ylabel("Frequency") plt.title(f"Average: {average_complete:.2f}") plt.grid() plt.show()
运行后结果会趋近于8,和文献中的理论值一致。
3. E(C)=8的推导逻辑
在三维均匀泊松点过程生成的Voronoi图中,完全邻居的期望数可通过积分几何和泊松点过程的空球概率推导:
- 对于任意一个生成元u,考虑以u为中心的所有可能方向,计算另一个点v成为u的完全邻居的概率;
- 利用泊松点过程的性质,积分所有可能的v的位置,结合空球(无其他点在uv直径球内)的概率,最终得到期望数为8。
文献《空间剖分:Voronoi图的概念与应用》中表5.5.2的结果是该理论推导的标准结论。
内容的提问来源于stack exchange,提问作者student.a
相关产品推荐
相关产品推荐

