From 59d5a521a83aefd1bbfa65738abb952adf981673 Mon Sep 17 00:00:00 2001 From: ponchio Date: Sat, 6 Mar 2004 15:45:35 +0000 Subject: [PATCH] Renamed from similar --- vcg/math/similarity.h | 107 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 vcg/math/similarity.h diff --git a/vcg/math/similarity.h b/vcg/math/similarity.h new file mode 100644 index 00000000..a7e059d8 --- /dev/null +++ b/vcg/math/similarity.h @@ -0,0 +1,107 @@ +#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 \ No newline at end of file