HoLa-BRep-test / eval /eval_pc_set.py
YuXingyao's picture
Initial commit
990e2a9
import numpy as np
def evaluate_uniformity_nnd(points):
"""
Evaluate point cloud uniformity using Nearest Neighbor Distance (NND)
Args:
points: numpy array of shape (N, 3)
Returns:
dict containing NND statistics
"""
# 1. 计算每个点到其最近邻的距离
diff = points[:, None, :] - points[None, :, :] # (N, N, 3)
distances = np.sqrt(np.sum(diff * diff, axis=-1)) # (N, N)
# 将自身距离设为无穷大
np.fill_diagonal(distances, np.inf)
# 获取每个点的最近邻距离
min_distances = np.min(distances, axis=1) # (N,)
# 2. 计算统计指标
metrics = {
'mean_nnd': np.mean(min_distances),
'std_nnd' : np.std(min_distances),
'cv_nnd' : np.std(min_distances) / np.mean(min_distances), # 变异系数
'min_nnd' : np.min(min_distances),
'max_nnd' : np.max(min_distances),
# Clark-Evans R统计量: R = 实际平均最近邻距离 / 期望平均最近邻距离
# R接近1表示随机分布,R<1表示聚集,R>1表示均匀
'density' : len(points) / np.prod(np.max(points, axis=0) - np.min(points, axis=0)),
}
# 计算Clark-Evans R统计量
expected_mean_dist = 0.5 / np.sqrt(metrics['density'])
metrics['clark_evans_r'] = metrics['mean_nnd'] / expected_mean_dist
# 3. 计算直方图数据(可用于可视化)
hist, bins = np.histogram(min_distances, bins='auto', density=True)
metrics['hist_values'] = hist
metrics['hist_bins'] = bins
return metrics