import numpy as np LARGE_MESH_THRESHOLD = 1000 MINIMUM_SAMPLE_COUNT = 100 MIN_AREA_WEIGHT = 1 MAX_AREA_WEIGHT = 10 def sample_colors(face_colors, sampling_ratio=0.1, face_areas=None): total_faces = len(face_colors) if total_faces > LARGE_MESH_THRESHOLD: number_to_sample = max(int(total_faces * sampling_ratio), MINIMUM_SAMPLE_COUNT) randomly_selected_indices = np.random.choice( total_faces, size=number_to_sample, replace=False ) selected_face_colors = face_colors[randomly_selected_indices] print( f"Sampled {number_to_sample} of {total_faces} faces ({sampling_ratio*100:.1f}%)" ) if face_areas is not None: selected_areas = face_areas[randomly_selected_indices] area_based_repetitions = compute_area_weights(selected_areas) return np.repeat(selected_face_colors, area_based_repetitions, axis=0) return selected_face_colors else: print(f"Using all {total_faces} faces (below sampling threshold)") if face_areas is not None: area_based_repetitions = compute_area_weights(face_areas) return np.repeat(face_colors, area_based_repetitions, axis=0) return face_colors def compute_area_weights(areas): mean_area = areas.mean() normalized_weights = areas / mean_area integer_weights = normalized_weights.astype(int) return integer_weights.clip(MIN_AREA_WEIGHT, MAX_AREA_WEIGHT)