You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三维ℝ³中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 09:00:55