From 02966b735b1245e1d036d1a7eb5a1f554d281d5d Mon Sep 17 00:00:00 2001 From: ponchio Date: Fri, 5 Mar 2004 15:15:11 +0000 Subject: [PATCH] Created. --- vcg/math/similar.h | 105 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 vcg/math/similar.h diff --git a/vcg/math/similar.h b/vcg/math/similar.h new file mode 100644 index 00000000..020a556c --- /dev/null +++ b/vcg/math/similar.h @@ -0,0 +1,105 @@ +#ifndef SIMILAR_H +#define SIMILAR_H + +#include +#include + +namespace vcg { + +template class Similar { +public: + Similar() {} + + Similar operator*(const Similar &affine) const; + Similar &operator*=(const Similar &affine); + Point3 operator*(const Point3 &p) const; + + + void SetIdentity(); + void SetScale(const S s); + Similar &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 Similar Similar::operator*(const Similar &a) const { + Similar r; + r.rot = rot * a.rot; + r.sca = sca * a.sca; + r.tra = (rot.Rotate(a.tra)) * sca + tra; + return r; +} + +template Similar &Similar::operator*=(const Similar &a) { + rot = rot * a.rot; + sca = sca * a.sca; + tra = (rot.Rotate(a.tra)) * sca + tra; + return *this; +} + +template Point3 Similar::operator*(const Point3 &p) const { + Point3 r = rot.Rotate(p); + r *= sca; + r += tra; + return r; +} + +template void Similar::SetIdentity() { + rot.FromAxis(0, Point3(1, 0, 0)); + tra = Point3(0, 0, 0); + sca = 1; +} + +template void Similar::SetScale(const S s) { + SetIdentity(); + sca = s; +} + +template Similar &Similar::SetTranslate(const Point3 &t) { + SetIdentity(); + tra = t; + return *this; +} + +template void Similar::SetRotate(S angle, const Point3 &axis) { + SetIdentity(); + rot.FromAxis(angle, axis); +} + +template Matrix44 Similar::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 Similar &invert(Similar &a) { + //WARNING:: TEST THIS!!! + a.rot.Invert(); + a.sca = 1/a.sca; + a.tra = a.rot.Rotate(-a.tra)*a.sca; + return a; +} + +template Similar interpolate(const Similar &a, const Similar &b, const S t) { + Similar 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 Similar Similarf; +typedef SimilarSimilard; + +} //namespace + +#endif \ No newline at end of file