# generic types
from typing import List # for initialization of lists
# Simple vector, matrix, quaternion
[docs]
class Vector3:
"""A simple 3D vector class."""
def __init__(self, x: float = 0.0, y: float = 0.0, z: float = 0.0):
self.x = x
self.y = y
self.z = z
def __repr__(self):
return f"Vector3({self.x}, {self.y}, {self.z})"
def __getitem__(self, index: int) -> float:
if index == 0:
return self.x
elif index == 1:
return self.y
elif index == 2:
return self.z
else:
raise IndexError("Index out of range for Vector3")
def __setitem__(self, index: int, value: float) -> None:
if index == 0:
self.x = value
elif index == 1:
self.y = value
elif index == 2:
self.z = value
else:
raise IndexError("Index out of range for Vector3")
[docs]
class Quaternion:
"""A simple quaternion class."""
def __init__(self, x: float = 1.0, y: float = 0.0, z: float = 0.0, w: float = 0.0):
self.x = x
self.y = y
self.z = z
self.w = w
def __repr__(self):
return f"Quaternion({self.x}, {self.y}, {self.z}, {self.w})"
def __getitem__(self, index: int) -> float:
if index == 0:
return self.x
elif index == 1:
return self.y
elif index == 2:
return self.z
elif index == 3:
return self.w
else:
raise IndexError("Index out of range for Quaternion")
def __setitem__(self, index: int, value: float) -> None:
if index == 0:
self.x = value
elif index == 1:
self.y = value
elif index == 2:
self.z = value
elif index == 3:
self.w = value
else:
raise IndexError("Index out of range for Quaternion")
[docs]
class Matrix3:
"""A simple 3x3 matrix class."""
def __init__(self, elements=None):
if elements is None:
elements = [
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
]
if len(elements) != 3 or any(len(row) != 3 for row in elements):
raise ValueError("Matrix3 must be initialized with a 3x3 list")
self.elements = [[float(value) for value in row] for row in elements]
def __repr__(self):
return (
f"Matrix3([{self.elements[0][0]}, {self.elements[0][1]}, {self.elements[0][2]}], "
f"[{self.elements[1][0]}, {self.elements[1][1]}, {self.elements[1][2]}], "
f"[{self.elements[2][0]}, {self.elements[2][1]}, {self.elements[2][2]}])"
)
def __getitem__(self, index: int):
return self.elements[index]
def __setitem__(self, index: int, value):
if len(value) != 3:
raise ValueError("Each row of Matrix3 must have exactly 3 elements")
self.elements[index] = [float(v) for v in value]
[docs]
@classmethod
def zero(cls):
return cls([
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
])
[docs]
@classmethod
def identity(cls):
return cls([
[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0],
])