/* libsegl - Sebas Extended GL Library * Collection of Opengl/3D-Math helpers * * Copyright (c) 2008 by Sebastian Lohff, seba@seba-geek.de * http://www.seba-geek.de * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "rotationsmatrix.h" namespace segl { Rotationsmatrix::Rotationsmatrix() : Matrix(3,3) { set(x_axis, 0.0f); } Rotationsmatrix::Rotationsmatrix(axis _ax, float _deg) : Matrix(3,3) { set(_ax, _deg); } Rotationsmatrix::Rotationsmatrix(Punkt3D _rotvec, float _deg) : Matrix(3,3) { set(_rotvec, _deg); } void Rotationsmatrix::set(Punkt3D _rotvec, float _deg) { rotvec = _rotvec; rotvec.normalize(); deg = _deg; initRot(); } void Rotationsmatrix::set(axis _ax, float _deg) { deg = _deg; switch(_ax) { case x_axis: rotvec.set(1.0f, 0.0f, 0.0f); break; case y_axis: rotvec.set(0.0f, 1.0f, 0.0f); break; case z_axis: rotvec.set(0.0f, 0.0f, 1.0f); break; } initRot(); } void Rotationsmatrix::set(float _deg) { deg = _deg; // rotvec.print(); initRot(); } void Rotationsmatrix::initRot() { c[0][0] = scos(deg) + pow(rotvec.x,2.0f) * (1 - scos(deg)); c[0][1] = rotvec.x * rotvec.y * (1 - scos(deg)) - rotvec.z * ssin(deg); c[0][2] = rotvec.x * rotvec.z * (1 - scos(deg)) + rotvec.y * ssin(deg); c[1][0] = rotvec.y * rotvec.x * (1 - scos(deg)) + rotvec.z * ssin(deg); c[1][1] = scos(deg) + pow(rotvec.y,2.0f) * (1 - scos(deg)); c[1][2] = rotvec.y * rotvec.z * (1 - scos(deg)) - rotvec.x * ssin(deg); c[2][0] = rotvec.z * rotvec.x * (1 - scos(deg)) - rotvec.y * ssin(deg); c[2][1] = rotvec.z * rotvec.y * (1 - scos(deg)) + rotvec.x * ssin(deg); c[2][2] = scos(deg) + pow(rotvec.z,2.0f) * (1 - scos(deg)); } Punkt3D Rotationsmatrix::operator*(const Punkt3D &p) { Matrix erg(3,1); Punkt3D erg2; erg = (((Matrix*)(this))->operator*(Matrix(p))); const float **mat = erg.getMatrix(); erg2.set(mat[0][0], mat[1][0], mat[2][0]); return erg2; } Rotationsmatrix Rotationsmatrix::operator*(const Rotationsmatrix &p) { Matrix m(3, 3); Rotationsmatrix rotmat; m = ((Matrix)(*this) * (Matrix)p); const float **mat = m.getMatrix(); rotmat.c[0][0] = mat[0][0]; rotmat.c[0][1] = mat[0][1]; rotmat.c[0][2] = mat[0][2]; rotmat.c[1][0] = mat[1][0]; rotmat.c[1][1] = mat[1][1]; rotmat.c[1][2] = mat[1][2]; rotmat.c[2][0] = mat[2][0]; rotmat.c[2][1] = mat[2][1]; rotmat.c[2][2] = mat[2][2]; return rotmat; } Rotationsmatrix::~Rotationsmatrix() { } } // namespace segl