import numpy as np def calc_distance(a, b=None, c=None): if b is None and c is None: raise ValueError("At least one of 'b' or 'c' must be provided.") distances = [] if b is not None: distances.append(np.linalg.norm(np.array(a) - np.array(b))) if c is not None: distances.append(np.linalg.norm(np.array(a) - np.array(c))) return np.mean(distances) def calc_sqr_size(cm_size, twenty_cm_in_pixels): return (cm_size / 20) * twenty_cm_in_pixels def distance_point_to_segment(point, segment_start, segment_end): point = np.array(point) segment_start = np.array(segment_start) segment_end = np.array(segment_end) # Vector from segment_start to segment_end segment_vector = segment_end - segment_start # Vector from segment_start to point point_vector = point - segment_start # Project point_vector onto segment_vector segment_len_sq = np.dot(segment_vector, segment_vector) if segment_len_sq == 0: # Segment is a point return np.linalg.norm(point - segment_start) t = np.dot(point_vector, segment_vector) / segment_len_sq t = max(0, min(1, t)) # Clamp t to [0, 1] # Closest point on the line segment closest_point = segment_start + t * segment_vector return np.linalg.norm(point - closest_point)