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