glc_matrix4x4.cpp

Go to the documentation of this file.
00001 /****************************************************************************
00002 
00003  This file is part of the GLC-lib library.
00004  Copyright (C) 2005-2008 Laurent Ribon (laumaya@users.sourceforge.net)
00005  http://glc-lib.sourceforge.net
00006 
00007  GLC-lib is free software; you can redistribute it and/or modify
00008  it under the terms of the GNU Lesser General Public License as published by
00009  the Free Software Foundation; either version 3 of the License, or
00010  (at your option) any later version.
00011 
00012  GLC-lib is distributed in the hope that it will be useful,
00013  but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015  GNU Lesser General Public License for more details.
00016 
00017  You should have received a copy of the GNU Lesser General Public License
00018  along with GLC-lib; if not, write to the Free Software
00019  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00020 
00021 *****************************************************************************/
00023 
00024 #include "glc_matrix4x4.h"
00025 
00026 #include <QtDebug>
00027 
00029 // Set Functions
00031 
00032 GLC_Matrix4x4& GLC_Matrix4x4::fromEuler(const double angle_x, const double angle_y, const double angle_z)
00033 {
00034     const double A= cos(angle_x);
00035     const double B= sin(angle_x);
00036     const double C= cos(angle_y);
00037     const double D= sin(angle_y);
00038     const double E= cos(angle_z);
00039     const double F= sin(angle_z);
00040 
00041     const double AD= A * D;
00042     const double BD= B * D;
00043 
00044     m_Matrix[0]  = C * E;
00045     m_Matrix[4]  = -C * F;
00046     m_Matrix[8]  = -D;
00047     m_Matrix[1]  = -BD * E + A * F;
00048     m_Matrix[5]  = BD * F + A * E;
00049     m_Matrix[9]  = -B * C;
00050     m_Matrix[2]  = AD * E + B * F;
00051     m_Matrix[6]  = -AD * F + B * E;
00052     m_Matrix[10] = A * C;
00053 
00054     m_Matrix[12]=  0.0; m_Matrix[13]= 0.0; m_Matrix[14]= 0.0; m_Matrix[3]= 0.0; m_Matrix[7]= 0.0; m_Matrix[11] = 0.0;
00055     m_Matrix[15] =  1.0;
00056 
00057         return *this;
00058 }
00059 
00060 GLC_Matrix4x4& GLC_Matrix4x4::setColumn(int index, const GLC_Vector3d& vector)
00061 {
00062         Q_ASSERT(index < 4);
00063         index= index * 4;
00064         m_Matrix[index]= vector.x();
00065         m_Matrix[index + 1]= vector.y();
00066         m_Matrix[index + 2]= vector.z();
00067 
00068         m_Type= General;
00069 
00070         return *this;
00071 }
00073 // Private services function
00075 
00076 QVector<double> GLC_Matrix4x4::toEuler(void) const
00077 {
00078         double angle_x;
00079         double angle_y;
00080         double angle_z;
00081         double tracex, tracey;
00082         angle_y= -asin(m_Matrix[8]);
00083         double C= cos(angle_y);
00084 
00085         if (!qFuzzyCompare(C, 0.0)) // Gimball lock?
00086         {
00087                 tracex= m_Matrix[10] / C;
00088                 tracey= - m_Matrix[9] / C;
00089                 angle_x= atan2( tracey, tracex);
00090 
00091                 tracex= m_Matrix[0] / C;
00092                 tracey= - m_Matrix[4] / C;
00093                 angle_z= atan2( tracey, tracex);
00094         }
00095         else // Gimball lock?
00096         {
00097                 angle_x= 0.0;
00098                 tracex= m_Matrix[5] / C;
00099                 tracey= m_Matrix[1] / C;
00100                 angle_z= atan2( tracey, tracex);
00101         }
00102         QVector<double> result;
00103         result.append(fmod(angle_x, 2.0 * glc::PI));
00104         result.append(fmod(angle_y, 2.0 * glc::PI));
00105         result.append(fmod(angle_z, 2.0 * glc::PI));
00106 
00107         return result;
00108 }
00109 
00110 QString GLC_Matrix4x4::toString() const
00111 {
00112         QString result;
00113         for (int i= 0; i < DIMMAT4X4; ++i)
00114         {
00115                 result+= (QString::number(m_Matrix[0 + i])) + QString(" ");
00116                 result+= (QString::number(m_Matrix[4 + i])) + QString(" ");
00117                 result+= (QString::number(m_Matrix[8 + i])) + QString(" ");
00118                 result+= (QString::number(m_Matrix[12 + i])) + QString("\n");
00119         }
00120         result.remove(result.size() - 1, 1);
00121         return result;
00122 }

SourceForge.net Logo

©2005-2011 Laurent Ribon