úÎ ±(      !"#$%&' Safe-Inferedq_out = q_in^-1  return ||q|| q /= ||q|| quaternion multiply: qa * qb #quaternion multiply then normalize () () Safe-Infered c = a (cross) b c = a (dot) b c = vec (dot) vec norm(x)  norm(a - b) vec_out = vec_in*scale_factor vec_out = scale (new_norm/norm(vec_in)) vec_in vec_out = vec_in/ norm(vec_in)  v_out = M*v  *+,-     *+,- Safe-Infered"vec_b = R_a2b * vec_a #vec_a = R_a2b^T * vec_b $#vec_b = q_a2b * vec_a * q_a2b^(-1)  vec_b = R(q_a2b) * vec_a  !"#$%&'  !"#$%&' ! "#$%&' !"#$%&'.      !"#$%&'()*+spatial-math-0.1.5QuatXyz SpatialMath zipWithQuatinvnorm normalizeqmultqmult' zipWithXyzcrossdot normSquareddistancescale normalizeTo mult3x3ByXyzmult3x3TransposeByXyzEulerrotateXyzAboutXrotateXyzAboutYrotateXyzAboutZeuler321OfQuat quatOfDcm quatOfDcmB2A euler321OfDcmquatOfEuler321 dcmOfQuat dcmOfEuler321 dcmOfQuatB2A rotVecByDcmrotVecByDcmB2A rotVecByQuatrotVecByQuatB2A rotVecByEulerrotVecByEulerB2A $fNumQuat $fFunctorQuat $fFloatingXyz$fFractionalXyz$fNumXyz $fFunctorXyz