"""General math helper tools."""
import math
from typing import Tuple
from neoscore.core.point import Point
from neoscore.core.units import Unit
[docs]def interpolate(line_start: Point, line_end: Point, x: Unit) -> Unit:
"""Calculate the value of a line defined by two points at a given x pos."""
slope = (line_end.y - line_start.y) / (line_end.x - line_start.x)
y_intercept = line_start.y - (line_start.x * slope)
return (x * slope) + y_intercept
[docs]def is_power_of_2(value: int) -> bool:
"""Check if a number is a power of 2."""
return (value & (value - 1) == 0) and value != 0
[docs]def point_angle(point: Point) -> float:
"""Calculate the angle from the positive X axis to a point in radians.
The returned angle goes positive clockwise and is between pi and -pi.
Combine with the Python stdlib function ``math.degrees()`` to get
the angle in degrees.
"""
return math.atan2(point.y.base_value, point.x.base_value)
[docs]def dist(p1: Tuple[float, float], p2: Tuple[float, float]) -> float:
"""Find the Euclidean distance between two 2D float tuples.
In the future this function and signature may be modified to support neoscore
unit-points as well.
"""
return math.sqrt(((p2[1] - p1[1]) ** 2) + ((p2[0] - p1[0]) ** 2))