Quat类重载__mul__运算符失败,无法实现实例间乘法
四元数类链式乘法问题解决
你的代码核心问题是乘法运算符重载方法的命名错误:你写的是___mul__(三个下划线),但Python规定运算符重载方法必须是双下划线包裹,也就是__mul__,这导致Python无法识别你重载的*运算符,所以抛出类型错误。
修正后的Quat类关键代码如下:
import math from .vec3 import Vec3 class Quat: @classmethod def from_axis_angle(cls, _axis=Vec3(1.0, 0.0, 0.0), _angle=0.0): w = math.cos(_angle * 0.5) x = _axis.x * math.sin(_angle * 0.5) y = _axis.y * math.sin(_angle * 0.5) z = _axis.z * math.sin(_angle * 0.5) return cls(w, x, y, z) def __init__(self, _w, _x, _y, _z): self.w = _w self.x = _x self.y = _y self.z = _z def mult(self, _rhs): lhs_vec = Vec3(self.x, self.y, self.z) rhs_vec = Vec3(_rhs.x, _rhs.y, _rhs.z) w = self.w * _rhs.w - lhs_vec.dot(rhs_vec) xyz = self.w * rhs_vec + _rhs.w * lhs_vec + lhs_vec.cross(rhs_vec) return Quat(w, xyz.x, xyz.y, xyz.z) # 修正:把___mul__改为__mul__ def __mul__(self, _rhs): lhs_vec = Vec3(self.x, self.y, self.z) rhs_vec = Vec3(_rhs.x, _rhs.y, _rhs.z) w = self.w * _rhs.w - lhs_vec.dot(rhs_vec) xyz = self.w * rhs_vec + _rhs.w * lhs_vec + lhs_vec.cross(rhs_vec) return Quat(w, xyz.x, xyz.y, xyz.z) def __rmul__(self, _rhs): return _rhs.__mul__(self) def to_axis_angle(self): xyz = Vec3(self.x, self.y, self.z) if xyz.is_zero(): axis = Vec3(1.0, 0.0, 0.0) angle = 0 return (axis, angle) axis = xyz.normalised() angle = math.acos(self.w) * 2.0 return (axis, angle)
修正后,a * b * c会被Python解析为(a * b) * c,由于__mul__方法返回的是新的Quat实例,因此可以正常支持链式乘法操作。
内容的提问来源于stack exchange,提问作者Type Definition
相关产品推荐
相关产品推荐

