orientation and phase

This commit is contained in:
Teodora Iulia Craciun 2026-08-16 21:50:25 +02:00
parent 98b3793446
commit 034b79bbbd

View File

@ -5,6 +5,10 @@ class Vector(NamedTuple):
x: float x: float
y: float y: float
class Orientation(NamedTuple):
theta_radians: float
theta_degrees: float
current_pos = Vector(3,2) current_pos = Vector(3,2)
target_pos = Vector(7,5) target_pos = Vector(7,5)
zero_vector = Vector(0,0) zero_vector = Vector(0,0)
@ -18,9 +22,20 @@ def main() -> None:
distance = length(displacement) distance = length(displacement)
print(distance) print(distance)
direction = safe_normalize(displacement, 2) # minimum distance = 0.001 direction = safe_normalize(displacement, 0.001) # minimum distance = 0.001 or 1.0e-6
# the safe guard depends on the our coordinate scale (ex. cm or m)
print(direction) print(direction)
theta = orientation(displacement)
print(theta)
#phase = wrap_phase(theta.theta_radians)
phase = wrap_phase(6.5)
print(phase)
phase = wrap_phase_v2(730)
print(phase)
## calculate the displacement from current position to target position ## calculate the displacement from current position to target position
@ -39,7 +54,9 @@ def length(vector: Vector) -> float:
return math.sqrt(squared_x + squared_y) return math.sqrt(squared_x + squared_y)
## safe normalisation (keep the direction while ignoring the distance) ## safe normalisation (keep the direction while ignoring the distance)
# The minimum-distance check also prevents division by zero. # The minimum-distance is a safeguard. It says that extremely small distances should be treated
# as too small to produce a stable direction and also prevents division by zero.
# the safe guard depends on the system coordinate scale (ex. cm or m)
def safe_normalize(vector: Vector, minimum_distance: float) -> Vector: def safe_normalize(vector: Vector, minimum_distance: float) -> Vector:
vector_length = length(vector) vector_length = length(vector)
@ -50,3 +67,34 @@ def safe_normalize(vector: Vector, minimum_distance: float) -> Vector:
einheitsVector = Vector(vector.x / vector_length, vector.y / vector_length) # unit vector einheitsVector = Vector(vector.x / vector_length, vector.y / vector_length) # unit vector
return einheitsVector return einheitsVector
## angle in radians an degrees betwen -pi and pi
def orientation(displacement: Vector) -> Orientation:
angle = math.atan2(displacement.y, displacement.x)
angle_degree = math.degrees(angle)
rv = Orientation(angle, angle_degree)
return rv
## wraping a phase
def wrap_phase(phase: float) -> float:
full_turn = 2*math.pi
if phase >= full_turn:
return phase % full_turn
return phase
def wrap_phase_v2(phase: int) -> int:
full_turn = 360
if phase >= full_turn:
return phase % full_turn
return phase