Replacing LinearAlgebra by repo subtree...
This commit is contained in:
parent
2065789576
commit
b87c4df0e3
@ -1,13 +0,0 @@
|
|||||||
import math
|
|
||||||
|
|
||||||
class Angle:
|
|
||||||
Rad2Deg = 360 / (math.pi * 2)
|
|
||||||
Deg2Rad = (math.pi * 2) / 360
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def Normalize(angle):
|
|
||||||
while angle < -180:
|
|
||||||
angle += 360
|
|
||||||
while angle >= 180:
|
|
||||||
angle -= 360
|
|
||||||
return angle
|
|
@ -1,52 +0,0 @@
|
|||||||
import math
|
|
||||||
from LinearAlgebra.Angle import Angle
|
|
||||||
|
|
||||||
class Direction:
|
|
||||||
def __init__(self, horizontal=0, vertical=0):
|
|
||||||
self.horizontal: float = Angle.Normalize(horizontal)
|
|
||||||
self.vertical: float = Angle.Normalize(vertical)
|
|
||||||
self.Normalize()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def Degrees(horizontal: float, vertical: float):
|
|
||||||
direction = Direction (horizontal, vertical)
|
|
||||||
return direction
|
|
||||||
|
|
||||||
def __add__(self, other):
|
|
||||||
return Direction(self.horizontal + other.x, self.vertical + other.y)
|
|
||||||
|
|
||||||
def __neg__(self):
|
|
||||||
return Direction(self.horizontal + 180, -self.vertical)
|
|
||||||
|
|
||||||
def __sub__(self, other):
|
|
||||||
return Direction(self.horizontal - other.x, self.vertical - other.y)
|
|
||||||
|
|
||||||
def __mul__(self, scalar):
|
|
||||||
return Direction(self.horizontal * scalar, self.vertical * scalar)
|
|
||||||
|
|
||||||
def __truediv__(self, scalar):
|
|
||||||
if scalar != 0:
|
|
||||||
return Direction(self.horizontal / scalar, self.vertical / scalar)
|
|
||||||
else:
|
|
||||||
raise ValueError("Cannot divide by zero")
|
|
||||||
|
|
||||||
def Magnitude(self):
|
|
||||||
return math.sqrt(self.horizontal**2 + self.vertical**2)
|
|
||||||
|
|
||||||
def Normalize(self):
|
|
||||||
if self.vertical > 90 or self.vertical < -90:
|
|
||||||
self.horizontal += 180
|
|
||||||
self.verical = 180 - self.verical
|
|
||||||
|
|
||||||
def Dot(self, other):
|
|
||||||
return self.horizontal * other.x + self.vertical * other.y
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return f"Direction(x={self.horizontal}, y={self.vertical})"
|
|
||||||
|
|
||||||
Direction.forward = Direction(0, 0)
|
|
||||||
Direction.backward = Direction(-180, 0)
|
|
||||||
Direction.up = Direction(0, 90)
|
|
||||||
Direction.down = Direction(0, -90)
|
|
||||||
Direction.left = Direction(-90, 0)
|
|
||||||
Direction.right = Direction(90, 0)
|
|
@ -1,44 +0,0 @@
|
|||||||
import math
|
|
||||||
|
|
||||||
Deg2Rad = (math.pi * 2) / 360
|
|
||||||
|
|
||||||
class Quaternion:
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.x = 0
|
|
||||||
self.y = 0
|
|
||||||
self.z = 0
|
|
||||||
self.w = 1
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def Euler(x, y, z):
|
|
||||||
yaw = x * Deg2Rad
|
|
||||||
pitch = y * Deg2Rad
|
|
||||||
roll = z * Deg2Rad
|
|
||||||
|
|
||||||
roll_over_2 = roll * 0.5
|
|
||||||
sin_roll_over_2 = math.sin(roll_over_2)
|
|
||||||
cos_roll_over_2 = math.cos(roll_over_2)
|
|
||||||
|
|
||||||
pitch_over_2 = pitch * 0.5
|
|
||||||
sin_pitch_over_2 = math.sin(pitch_over_2)
|
|
||||||
cos_pitch_over_2 = math.cos(pitch_over_2)
|
|
||||||
|
|
||||||
yaw_over_2 = yaw * 0.5
|
|
||||||
sin_yaw_over_2 = math.sin(yaw_over_2)
|
|
||||||
cos_yaw_over_2 = math.cos(yaw_over_2)
|
|
||||||
|
|
||||||
result = Quaternion()
|
|
||||||
result.w = (cos_yaw_over_2 * cos_pitch_over_2 * cos_roll_over_2 +
|
|
||||||
sin_yaw_over_2 * sin_pitch_over_2 * sin_roll_over_2)
|
|
||||||
result.x = (sin_yaw_over_2 * cos_pitch_over_2 * cos_roll_over_2 +
|
|
||||||
cos_yaw_over_2 * sin_pitch_over_2 * sin_roll_over_2)
|
|
||||||
result.y = (cos_yaw_over_2 * sin_pitch_over_2 * cos_roll_over_2 -
|
|
||||||
sin_yaw_over_2 * cos_pitch_over_2 * sin_roll_over_2)
|
|
||||||
result.z = (cos_yaw_over_2 * cos_pitch_over_2 * sin_roll_over_2 -
|
|
||||||
sin_yaw_over_2 * sin_pitch_over_2 * cos_roll_over_2)
|
|
||||||
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
Quaternion.identity = Quaternion()
|
|
@ -1,41 +0,0 @@
|
|||||||
import math
|
|
||||||
from LinearAlgebra.Direction import Direction
|
|
||||||
|
|
||||||
class Spherical:
|
|
||||||
def __init__(self, distance, direction):
|
|
||||||
if distance < 0:
|
|
||||||
self.distance = -distance
|
|
||||||
self.direction = -direction
|
|
||||||
else:
|
|
||||||
self.distance: float = distance
|
|
||||||
self.direction: Direction = direction
|
|
||||||
|
|
||||||
# def __init__(self, distance, horizontal, vertical):
|
|
||||||
# self.distance = distance
|
|
||||||
# self.direction = Direction(horizontal, vertical)
|
|
||||||
|
|
||||||
def to_cartesian(self):
|
|
||||||
x = self.distance * math.sin(self.direction.horizontal) * math.cos(self.direction.vertical)
|
|
||||||
y = self.distance * math.sin(self.direction.horizontal) * math.sin(self.direction.vertical)
|
|
||||||
z = self.distance * math.cos(self.direction.horizontal)
|
|
||||||
return x, y, z
|
|
||||||
|
|
||||||
def from_cartesian(self, x, y, z):
|
|
||||||
self.distance = math.sqrt(x**2 + y**2 + z**2)
|
|
||||||
self.direction.horizontal = math.acos(z / self.distance)
|
|
||||||
self.direction.vertical = math.atan2(y, x)
|
|
||||||
|
|
||||||
def __add__(self, other):
|
|
||||||
x1, y1, z1 = self.to_cartesian()
|
|
||||||
x2, y2, z2 = other.to_cartesian()
|
|
||||||
return Spherical.from_cartesian(x1 + x2, y1 + y2, z1 + z2)
|
|
||||||
|
|
||||||
def __sub__(self, other):
|
|
||||||
x1, y1, z1 = self.to_cartesian()
|
|
||||||
x2, y2, z2 = other.to_cartesian()
|
|
||||||
return Spherical.from_cartesian(x1 - x2, y1 - y2, z1 - z2)
|
|
||||||
|
|
||||||
def __repr__(self):
|
|
||||||
return f"Spherical(r={self.distance}, horizontal={self.direction.horizontal}, phi={self.direction.vertical})"
|
|
||||||
|
|
||||||
Spherical.zero = Spherical(0, Direction.forward)
|
|
@ -1,28 +0,0 @@
|
|||||||
from LinearAlgebra.Direction import Direction
|
|
||||||
from LinearAlgebra.Quaternion import Quaternion
|
|
||||||
|
|
||||||
class SwingTwist:
|
|
||||||
"""A rotation using swing and twist angle components"""
|
|
||||||
def __init__(self, swing: Direction, twist: float):
|
|
||||||
if swing.vertical > 90 or swing.vertical < -90:
|
|
||||||
swing.horizontal += 180
|
|
||||||
swing.vertical = 180 - swing.vertical
|
|
||||||
twist += 180
|
|
||||||
|
|
||||||
## Swing component of the rotation
|
|
||||||
self.swing = swing
|
|
||||||
## The twist component of the rotation
|
|
||||||
self.twist = twist
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def Degrees(horizontal: float, vertical: float, twist: float):
|
|
||||||
direction = Direction(horizontal, vertical)
|
|
||||||
swing_twist = SwingTwist(direction, twist)
|
|
||||||
return swing_twist
|
|
||||||
|
|
||||||
def ToQuaternion(self) -> Quaternion:
|
|
||||||
"""Convert the SwingTwist rotation to a Quaternion"""
|
|
||||||
q = Quaternion.Euler(-self.swing.vertical,
|
|
||||||
self.swing.horizontal,
|
|
||||||
self.twist)
|
|
||||||
return q
|
|
Loading…
x
Reference in New Issue
Block a user