# utils.py import math def distance_between_points(p1, p2): # euclidean distance between two 3d points return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2 + (p1[2]-p2[2])**2) def angle_between_points(a, b, c): # returns the angle ABC (in degrees) where B is the vertex ab = (a[0]-b[0], a[1]-b[1], a[2]-b[2]) cb = (c[0]-b[0], c[1]-b[1], c[2]-b[2]) dot_product = ab[0]*cb[0] + ab[1]*cb[1] + ab[2]*cb[2] mag_ab = math.sqrt(ab[0]**2 + ab[1]**2 + ab[2]**2) mag_cb = math.sqrt(cb[0]**2 + cb[1]**2 + cb[2]**2) if mag_ab * mag_cb == 0: return 0 angle_rad = math.acos(dot_product / (mag_ab * mag_cb)) return math.degrees(angle_rad) def is_finger_extended(landmarks, finger, direction=None): # checks if a specific finger is extended based on joint angles finger_joints = { "thumb": [1, 2, 3, 4], "index": [5, 6, 7, 8], "middle": [9, 10, 11, 12], "ring": [13, 14, 15, 16], "pinky": [17, 18, 19, 20] } joints = finger_joints[finger] angle = angle_between_points(landmarks[joints[0]], landmarks[joints[1]], landmarks[joints[2]]) extended = angle > 160 # straight finger if direction == "up": return extended and landmarks[joints[-1]][1] < landmarks[joints[0]][1] elif direction == "down": return extended and landmarks[joints[-1]][1] > landmarks[joints[0]][1] return extended