2009-01-21 01:00:31 +01:00
|
|
|
/* 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.
|
|
|
|
*/
|
|
|
|
|
2008-02-09 13:43:23 +01:00
|
|
|
#include "matrix.h"
|
|
|
|
|
2008-08-10 17:14:54 +02:00
|
|
|
namespace segl {
|
|
|
|
|
2008-02-09 13:43:23 +01:00
|
|
|
Matrix::Matrix(int _m, int _n) {
|
|
|
|
m = _m;
|
|
|
|
n = _n;
|
|
|
|
allocate();
|
|
|
|
}
|
|
|
|
|
|
|
|
Matrix::Matrix(int _m, int _n, const float **src) {
|
|
|
|
m = _m;
|
|
|
|
n = _n;
|
|
|
|
allocate();
|
|
|
|
copyFromSource(src);
|
|
|
|
}
|
|
|
|
|
|
|
|
Matrix::Matrix(Punkt3D d) {
|
|
|
|
m = 3;
|
|
|
|
n = 1;
|
|
|
|
allocate();
|
|
|
|
c[0][0] = d.x;
|
|
|
|
c[1][0] = d.y;
|
|
|
|
c[2][0] = d.z;
|
|
|
|
}
|
|
|
|
|
|
|
|
Matrix::Matrix(const Matrix& mat) {
|
|
|
|
m = mat.m;
|
|
|
|
n = mat.n;
|
|
|
|
allocate();
|
|
|
|
copyFromSource(mat.getMatrix());
|
|
|
|
}
|
|
|
|
|
|
|
|
void Matrix::allocate() {
|
|
|
|
c = new float*[m];
|
|
|
|
for(int i=0; i<m; i++) {
|
|
|
|
c[i] = new float[n];
|
|
|
|
for(int t=0; t<n; t++)
|
|
|
|
c[i][t] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Matrix::copyFromSource(const float** src) {
|
|
|
|
for(int i=0; i<m; i++) {
|
|
|
|
for(int t=0; t<n; t++)
|
|
|
|
c[i][t] = src[i][t];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const float **Matrix::getMatrix() const {
|
|
|
|
return (const float**)c;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Matrix::set(float d, int _m, int _n) {
|
|
|
|
if(_m>=m||_n>=n)
|
|
|
|
return false;
|
|
|
|
c[_m][_n] = d;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2008-06-08 14:09:56 +02:00
|
|
|
float Matrix::get(int _m, int _n) {
|
|
|
|
if(_m>=m||_n>=n)
|
|
|
|
return 0.0f;
|
|
|
|
|
|
|
|
return c[_m][_n];
|
|
|
|
}
|
|
|
|
|
2008-02-09 13:43:23 +01:00
|
|
|
Matrix Matrix::operator*(const Matrix &d) {
|
|
|
|
|
|
|
|
if(n!=d.m)
|
|
|
|
return Matrix(1,1);
|
|
|
|
Matrix erg(m, d.n);
|
|
|
|
|
|
|
|
|
|
|
|
for(int a=0; a<m; a++) {
|
|
|
|
for(int b=0; b<d.n; b++) {
|
|
|
|
float zerg = 0.0f;
|
|
|
|
for(int _c=0; _c<n; _c++) {
|
|
|
|
zerg += c[a][_c] * d.c[_c][b];
|
|
|
|
}
|
|
|
|
erg.c[a][b] = zerg;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return erg;
|
|
|
|
}
|
|
|
|
|
|
|
|
Matrix& Matrix::operator=(const Matrix& mat) {
|
|
|
|
if(mat.m<=m&&mat.n<=n) {
|
|
|
|
copyFromSource(mat.getMatrix());
|
|
|
|
}
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2008-06-08 14:09:56 +02:00
|
|
|
Matrix Matrix::operator+(const float &f) {
|
|
|
|
Matrix tmp(*this);
|
|
|
|
for(int i=0; i<m; i++) {
|
|
|
|
for(int j=0; j<n; j++) {
|
|
|
|
tmp.c[i][j] += f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
Matrix Matrix::operator-(const float &f) {
|
|
|
|
Matrix tmp(*this);
|
|
|
|
for(int i=0; i<m; i++) {
|
|
|
|
for(int j=0; j<n; j++) {
|
|
|
|
tmp.c[i][j] -= f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
Matrix Matrix::operator*(const float &f) {
|
|
|
|
Matrix tmp(*this);
|
|
|
|
for(int i=0; i<m; i++) {
|
|
|
|
for(int j=0; j<n; j++) {
|
|
|
|
tmp.c[i][j] *= f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return tmp;
|
|
|
|
}
|
|
|
|
|
|
|
|
Matrix Matrix::operator/(const float &f) {
|
|
|
|
Matrix tmp(*this);
|
|
|
|
for(int i=0; i<m; i++) {
|
|
|
|
for(int j=0; j<n; j++) {
|
|
|
|
tmp.c[i][j] /= f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return tmp;
|
|
|
|
}
|
2008-02-09 13:43:23 +01:00
|
|
|
|
|
|
|
int Matrix::getM() const {
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
|
|
|
|
int Matrix::getN() const {
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Matrix::print(std::string s) const {
|
|
|
|
std::cout << "Matrix " << s << "(" << m << "," << n << ")" << std::endl;
|
|
|
|
for(int a=0; a<m; a++) {
|
|
|
|
for(int b=0; b<n; b++) {
|
2008-06-08 14:09:56 +02:00
|
|
|
std::cout << std::setw(15) << c[a][b];
|
2008-02-09 13:43:23 +01:00
|
|
|
}
|
|
|
|
std::cout << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Matrix::~Matrix() {
|
|
|
|
for(int i=0; i<m; i++) {
|
|
|
|
delete[](c[i]);
|
|
|
|
}
|
|
|
|
delete[](c);
|
|
|
|
}
|
2008-08-10 17:14:54 +02:00
|
|
|
|
|
|
|
} // namespace segl
|