libsegl/rotationsmatrix.cpp

119 lines
3.1 KiB
C++

/* 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