/**************************************************************************** * VCGLib o o * * Visual and Computer Graphics Library o o * * _ O _ * * Copyright(C) 2004 \/)\/ * * Visual Computing Lab /\/| * * ISTI - Italian National Research Council | * * \ * * All rights reserved. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * * for more details. * * * ****************************************************************************/ /**************************************************************************** History $Log: not supported by cvs2svn $ Revision 1.7 2004/05/04 23:23:45 cignoni unified to the gl stlyle matix*vector. removed vector*matrix operator Revision 1.6 2004/03/25 14:57:49 ponchio Microerror. ($LOG$ -> $Log: not supported by cvs2svn $ Microerror. ($LOG$ -> Revision 1.7 2004/05/04 23:23:45 cignoni Microerror. ($LOG$ -> unified to the gl stlyle matix*vector. removed vector*matrix operator Microerror. ($LOG$ -> ****************************************************************************/ #ifndef SIMILARITY_H #define SIMILARITY_H #include #include namespace vcg { template class Similarity { public: Similarity() {} Similarity(const Quaternion &q) { SetRotate(q); } Similarity(const Point3 &p) { SetTranslate(p); } Similarity(S s) { SetScale(s); } 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. Similarity &SetRotate(S angle, const Point3 & axis); Similarity &SetRotate(const Quaternion &q); Matrix44 Matrix() const; void FromMatrix(const Matrix44 &m); Quaternion rot; Point3 tra; S sca; }; template Similarity &Invert(Similarity &m); template Similarity Inverse(const Similarity &m); template Point3 operator*(const Similarity &m, const Point3 &p); 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 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 Similarity &Similarity::SetRotate(S angle, const Point3 &axis) { SetIdentity(); rot.FromAxis(angle, axis); return *this; } template Similarity &Similarity::SetRotate(const Quaternion &q) { SetIdentity(); rot = q; return *this; } template Matrix44 Similarity::Matrix() const { Matrix44 r; rot.ToMatrix(r); Matrix44 s = Matrix44().SetScale(sca, sca, sca); Matrix44 t = Matrix44().SetTranslate(tra[0], tra[1], tra[2]); return s*r*t; // scale * rot * trans } template void Similarity::FromMatrix(const Matrix44 &m) { sca = (S)pow(m.Determinant(), 1/3); assert(sca != 0); Matrix44 t = m * Matrix44().SetScale(1/sca, 1/sca, 1/sca); rot.FromMatrix(t); tra[0] = t.element(3, 0); tra[1] = t.element(3, 1); tra[2] = t.element(3, 2); } template Similarity &Invert(Similarity &a) { a.rot.Invert(); a.sca = 1/a.sca; a.tra = a.rot.Rotate(-a.tra)*a.sca; return a; } template Similarity Inverse(const Similarity &m) { Similarity a = m; return Invert(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; } template Point3 operator*(const Similarity &m, const Point3 &p) { Point3 r = m.rot.Rotate(p); r *= m.sca; r += m.tra; return r; } typedef Similarity Similarityf; typedef SimilaritySimilarityd; } //namespace #endif