import vectors class Matrix4x4: def __init__(self): self.row0 = None self.row1 = None self.row2 = None self.row3 = None def __init__(self, row0, row1, row2, row3): if not isinstance(row0, vectors.Vector4d): raise ValueError("Row must be a Vector4d object.", row0) if not isinstance(row1, vectors.Vector4d): raise ValueError("Row must be a Vector4d object.", row1) if not isinstance(row2, vectors.Vector4d): raise ValueError("Row must be a Vector4d object.", row2) if not isinstance(row3, vectors.Vector4d): raise ValueError("Row must be a Vector4d object.", row3) self.row0 = row0 self.row1 = row1 self.row2 = row2 self.row3 = row3 def multiply_3d(self, vector3d): x = vector3d.x * self.row0.x + vector3d.y * self.row1.x + vector3d.z * self.row2.x + self.row3.x y = vector3d.x * self.row0.y + vector3d.y * self.row1.y + vector3d.z * self.row2.y + self.row3.y z = vector3d.x * self.row0.z + vector3d.y * self.row1.z + vector3d.z * self.row2.z + self.row3.z w = vector3d.x * self.row0.w + vector3d.y * self.row1.w + vector3d.z * self.row2.w + self.row3.w if w != 0: x /= w y /= w z /= w return vectors.Vector3d(x, y, z) class Matrix3x3: def __init__(self): self.row0 = None self.row1 = None self.row2 = None def __init__(self, row0, row1, row2): self.row0 = row0 self.row1 = row1 self.row2 = row2