def premultiply_v4(self, v): x = v.x * self.m[0][0] + v.y * self.m[1][0] + v.z * self.m[2][0] + v.w * self.m[3][0] y = v.x * self.m[0][1] + v.y * self.m[1][1] + v.z * self.m[2][1] + v.w * self.m[3][1] z = v.x * self.m[0][2] + v.y * self.m[1][2] + v.z * self.m[2][2] + v.w * self.m[3][2] w = v.x * self.m[0][3] + v.y * self.m[1][3] + v.z * self.m[2][3] + v.w * self.m[3][3] return vector4.Vector4(x, y, z, w)
def posmultiply_v3(self, v, w): ox = self.m[0][0] * v.x + self.m[0][1] * v.y + self.m[0][2] * v.z + self.m[0][3] oy = self.m[1][0] * v.x + self.m[1][1] * v.y + self.m[1][2] * v.z + self.m[1][3] oz = self.m[2][0] * v.x + self.m[2][1] * v.y + self.m[2][2] * v.z + self.m[2][3] ow = self.m[3][0] * v.x + self.m[3][1] * v.y + self.m[3][2] * v.z + self.m[3][3] return vector4.Vector4(ox, oy, oz, ow)
def posmultiply_v4(self, v): x = self.m[0][0] * v.x + self.m[0][1] * v.y + self.m[0][2] * v.z + self.m[0][3] * v.w y = self.m[1][0] * v.x + self.m[1][1] * v.y + self.m[1][2] * v.z + self.m[1][3] * v.w z = self.m[2][0] * v.x + self.m[2][1] * v.y + self.m[2][2] * v.z + self.m[2][3] * v.w w = self.m[3][0] * v.x + self.m[3][1] * v.y + self.m[3][2] * v.z + self.m[3][3] * v.w return vector4.Vector4(x, y, z, w)
def premultiply_v3(self, v, w): ox = v.x * self.m[0][0] + v.y * self.m[1][0] + v.z * self.m[2][0] + w * self.m[3][0] oy = v.x * self.m[0][1] + v.y * self.m[1][1] + v.z * self.m[2][1] + w * self.m[3][1] oz = v.x * self.m[0][2] + v.y * self.m[1][2] + v.z * self.m[2][2] + w * self.m[3][2] ow = v.x * self.m[0][3] + v.y * self.m[1][3] + v.z * self.m[2][3] + w * self.m[3][3] return vector4.Vector4(ox, oy, oz, ow)
def numpy_matrix___rmul__(self, m): if isinstance(m, Matrix4): return Matrix4(m.m @ self.m) elif isinstance(m, vector4.Vector4): v = np.array([m.x, m.y, m.z, m.w]).transpose() v = self.m @ v return vector4.Vector4(v[0], v[1], v[2], v[3]) else: raise InvalidMatrixOperationException("mult", type(self), type(m))
def __rmul__(self, m): if isinstance(m, Matrix4): m2 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] for i in range(0, 4): for j in range(0, 4): m2[i][j] = 0 for k in range(0, 4): m2[i][j] += self.m[k][j] * m.m[i][k] return Matrix4(m2) elif isinstance(m, vector4.Vector4): x = self.m[0][0] * m.x + self.m[0][1] * m.y + self.m[0][2] * m.z + self.m[0][3] * m.w y = self.m[1][0] * m.x + self.m[1][1] * m.y + self.m[1][2] * m.z + self.m[1][3] * m.w z = self.m[2][0] * m.x + self.m[2][1] * m.y + self.m[2][2] * m.z + self.m[2][3] * m.w w = self.m[3][0] * m.x + self.m[3][1] * m.y + self.m[3][2] * m.z + self.m[3][3] * m.w return vector4.Vector4(x, y, z, w) else: raise InvalidMatrixOperationException("mult", type(self), type(m))
def __mul__(self, m): if isinstance(m, Matrix4): m2 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] for i in range(0, 4): for j in range(0, 4): m2[i][j] = 0 for k in range(0, 4): m2[i][j] += self.m[i][k] * m.m[k][j] return Matrix4(m2) elif isinstance(m, vector4.Vector4): x = m.x * self.m[0][0] + m.y * self.m[1][0] + m.z * self.m[2][0] + m.w * self.m[3][0] y = m.x * self.m[0][1] + m.y * self.m[1][1] + m.z * self.m[2][1] + m.w * self.m[3][1] z = m.x * self.m[0][2] + m.y * self.m[1][2] + m.z * self.m[2][2] + m.w * self.m[3][2] w = m.x * self.m[0][3] + m.y * self.m[1][3] + m.z * self.m[2][3] + m.w * self.m[3][3] return vector4.Vector4(x, y, z, w) else: raise InvalidMatrixOperationException("mult", type(self), type(m))
def numpy_matrix_posmultiply_v4(self, v): v = self.m @ np.array([v.x, v.y, v.z, v.w]) return vector4.Vector4(v[0], v[1], v[2], v[3])
def numpy_matrix_premultiply_v3(self, v, w): v = np.array([v.x, v.y, v.z, w]) @ self.m return vector4.Vector4(v[0], v[1], v[2], v[3])