File size: 1,559 Bytes
59c4adb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import math
from typing import Tuple

def calculate_angle(a: Tuple[float, float], b: Tuple[float, float], c: Tuple[float, float]) -> float:
    """

    Calculates the 2D angle between three points with the second point as the vertex.



    Args:

        a: (x, y) coordinates of the first point.

        b: (x, y) coordinates of the vertex point.

        c: (x, y) coordinates of the third point.



    Returns:

        float: The angle in degrees (0.0 if vectors are invalid).

    """
    ba = [a[0] - b[0], a[1] - b[1]]
    bc = [c[0] - b[0], c[1] - b[1]]
    
    dot_product = (ba[0] * bc[0]) + (ba[1] * bc[1])
    mag_ba = math.sqrt(ba[0]**2 + ba[1]**2)
    mag_bc = math.sqrt(bc[0]**2 + bc[1]**2)
    
    if mag_ba == 0 or mag_bc == 0:
        return 0.0
        
    cos_angle = max(-1.0, min(1.0, dot_product / (mag_ba * mag_bc)))
    return math.degrees(math.acos(cos_angle))

def get_midpoint(p1: Tuple[float, float], p2: Tuple[float, float]) -> Tuple[float, float]:
    """Calculates the geometric midpoint between two 2D coordinates."""
    return ((p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2)

def calculate_vertical_displacement(p1: Tuple[float, float], p2: Tuple[float, float]) -> float:
    """Calculates the absolute vertical (Y-axis) distance between two points."""
    return abs(p1[1] - p2[1])

def calculate_horizontal_displacement(p1: Tuple[float, float], p2: Tuple[float, float]) -> float:
    """Calculates the absolute horizontal (X-axis) distance between two points."""
    return abs(p1[0] - p2[0])