#ifndef SIMILARITY_H #define SIMILARITY_H #include #include namespace vcg { template class Similarity { public: Similarity() {} Similarity operator*(const Similarity &affine) const; Similarity &operator*=(const Similarity &affine); Point3 operator*(const Point3 &p) const; Similarity &SetIdentity(); Similarity &SetScale(const S s); Similarity &SetTranslate(const Point3 &t); ///use radiants for angle. void SetRotate(S angle, const Point3 & axis); Matrix44 Matrix() const; Quaternion rot; Point3 tra; S sca; }; template Similarity Similarity::operator*(const Similarity &a) const { Similarity r; r.rot = rot * a.rot; r.sca = sca * a.sca; r.tra = (rot.Rotate(a.tra)) * sca + tra; return r; } template Similarity &Similarity::operator*=(const Similarity &a) { rot = rot * a.rot; sca = sca * a.sca; tra = (rot.Rotate(a.tra)) * sca + tra; return *this; } template Point3 Similarity::operator*(const Point3 &p) const { Point3 r = rot.Rotate(p); r *= sca; r += tra; return r; } template Similarity &Similarity::SetIdentity() { rot.FromAxis(0, Point3(1, 0, 0)); tra = Point3(0, 0, 0); sca = 1; return *this; } template Similarity &Similarity::SetScale(const S s) { SetIdentity(); sca = s; return *this; } template Similarity &Similarity::SetTranslate(const Point3 &t) { SetIdentity(); tra = t; return *this; } template void Similarity::SetRotate(S angle, const Point3 &axis) { SetIdentity(); rot.FromAxis(angle, axis); } template Matrix44 Similarity::Matrix() const { Matrix44 r; rot.ToMatrix(r); r *= Matrix44().SetScale(sca, sca, sca); Matrix44 t = Matrix44().SetTranslate(tra[0], tra[1], tra[2]); r *= t; return r; } template Similarity &invert(Similarity &a) { //WARNING:: TEST THIS!!! a.rot.Invert(); a.sca = 1/a.sca; a.tra = a.rot.Rotate(-a.tra)*a.sca; return a; } template Similarity interpolate(const Similarity &a, const Similarity &b, const S t) { Similarity r; r.rot = interpolate(a.rot, b.rot, t); r.tra = t * a.tra + (1-t) * b.tra; r.sca = t * a.sca + (1-t) * b.sca; return r; } typedef Similarity Similarityf; typedef SimilaritySimilarityd; } //namespace #endif