In fm_matrix.h: class fm_vector; class fm_matrix { public: float data[16]; fm_matrix(); fm_matrix(float newdata[]); static fm_matrix RotMat_Deg (float degrees, fm_vector* axis); static fm_matrix TransMat (fm_vector* units); static fm_matrix ScaleMat (float factor); static fm_matrix IdentMat (); float operator[](int index); float* at (int index); fm_matrix transpose(); fm_matrix operator* (float rhs); fm_vector operator* (fm_vector* rhs); fm_matrix operator* (fm_matrix* rhs); void operator= (fm_matrix* rhs); float* getdata(); void display(); }; class fm_vector { public: float data[4]; fm_vector(); fm_vector(bool InitMe); fm_vector (float newdata[4]); fm_vector (float x, float y, float z, float n); float operator[](int index); float* at(int index); fm_vector operator* (float rhs); float operator* (fm_vector* rhs); void operator= (fm_vector* rhs); fm_vector operator* (fm_matrix* rhs); fm_vector operator/ (float rhs); fm_vector operator+ (fm_vector* rhs); void display(); fm_vector normalise(); }; In file fm_matrix.cpp #include "fm_matrix.h" //#include "fm_vector.h" #include #include //M_PI kort 'n define vir windows - #if defined(_USE_MATH_DEFINES) && !defined(_MATH_DEFINES_DEFINED) // #define _MATH_DEFINES_DEFINED fm_matrix::fm_matrix() { //std::cout << "creating new matrix" << std::endl; /*data = FM_Identity_Mat;*/ for (int i=0; i<16; i++) data[i] = 0; for (int i=0; i<16; i=i+5) data[i] = 1; //data = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; } fm_matrix::fm_matrix(float newdata[16]) { // data = newdata; for (int i=0; i<16; i++) data[i] = newdata[i]; } fm_matrix fm_matrix::RotMat_Deg (float degrees, fm_vector* axis) { const float Cosine = std::cos(degrees * M_PI / 180); const float Sine = std::sin(degrees * M_PI / 180); *(axis) = axis->normalise(); fm_matrix result; *(result.at(0)) = *(axis->at(0)) * *(axis->at(0)) * (1-Cosine) + Cosine; *(result.at(1)) = *(axis->at(0)) * *(axis->at(1)) * (1-Cosine) + *(axis->at(2)) * Sine; *(result.at(2)) = *(axis->at(0)) * *(axis->at(2)) * (1-Cosine) - *(axis->at(1)) * Sine; *(result.at(3)) = 0; *(result.at(4)) = *(axis->at(1)) * *(axis->at(0)) * (1-Cosine) - *(axis->at(2)) * Sine; *(result.at(5)) = *(axis->at(1)) * *(axis->at(1)) * (1-Cosine) + Cosine; *(result.at(6)) = *(axis->at(1)) * *(axis->at(2)) * (1-Cosine) + *(axis->at(0)) * Sine; *(result.at(7)) = 0; *(result.at(8)) = *(axis->at(2)) * *(axis->at(0)) * (1-Cosine) + *(axis->at(1)) * Sine; *(result.at(9)) = *(axis->at(2)) * *(axis->at(1)) * (1-Cosine) - *(axis->at(0)) * Sine; *(result.at(10)) = *(axis->at(2)) * *(axis->at(2)) * (1-Cosine) + Cosine; *(result.at(11)) = 0; *(result.at(12)) = 0; *(result.at(13)) = 0; *(result.at(14)) = 0; *(result.at(15)) = 1; return result; } fm_matrix fm_matrix::IdentMat() { fm_matrix mat1; return mat1; } fm_matrix fm_matrix::TransMat (fm_vector* units) { fm_matrix tmp; for (int i=0; i<3; i++) *(tmp.at(i+12)) = *(units->at(i)); return tmp; } fm_matrix fm_matrix::ScaleMat (float factor) { fm_matrix tmp; for (int i=0; i<15; i=i+5) *(tmp.at(i)) = factor; return tmp; } float* fm_matrix::at(int index) { if ((index < 0) || (index > 15)) return NULL; return &data[index]; } fm_matrix fm_matrix::transpose() { fm_matrix tmp; for (int i=0; i<4; i++) for (int j=0; j<4; j++) *(tmp.at(i*4+j)) = data[j*4+i]; return tmp; } fm_matrix fm_matrix::operator* (float rhs) { fm_matrix tmp; for (int i=0; i<16; i++) *(tmp.at(i)) = data[i] * rhs; return tmp; } fm_vector fm_matrix::operator* (fm_vector* rhs) { fm_vector tmp(false); for (int i=0; i<4; i++) { float sum=0; for (int j=0; j<4; j++) sum += *(rhs->at(j)) * data[i*4+j]; *(tmp.at(i)) = sum; } return tmp; } fm_matrix fm_matrix::operator* (fm_matrix* rhs) { fm_matrix tmp; for (int i=0; i<4; i++) for (int j=0; j<4; j++) { float sum=0; for (int k=0; k<4; k++) sum += *(rhs->at(i+k*4)) * data[j*4+k]; *(tmp.at(j*4+i)) = sum; } return tmp; } void fm_matrix::operator= (fm_matrix* rhs) { //fm_matrix tmp; for (int i=0; i<16; i++) //*(tmp.at(i)) = *(rhs->at(i)); data[i] = *(rhs->at(i)); //return tmp; } float* fm_matrix::getdata() { return &data[0]; } void fm_matrix::display() { //std::cout.precision(4); for (int i=0; i<4; i++) { for (int j=0; j<4; j++) std::cout << data[j*4+i] << " "; std::cout << std::endl; } } fm_vector::fm_vector() { fm_vector (true); } fm_vector::fm_vector(bool InitMe) { //std::cout << "creating new vector" << std::endl; if (InitMe) for (int i=0; i<4; i++) data[i]=0; } fm_vector::fm_vector(float newdata[4]) { //data = newdata; for (int i=0; i<4; i++) data[i] = newdata[i]; } fm_vector::fm_vector (float x, float y, float z, float n) { data[0] = x; data[1] = y; data[2] = z; data[3] = n; } float* fm_vector::at(int index) { if ((index < 0) || (index > 3)) return NULL; return &data[index]; } fm_vector fm_vector::operator* (float rhs) { fm_vector tmp; for (int i=0; i<4; i++) *(tmp.at(i)) = data[i]*rhs; return tmp; } float fm_vector::operator* (fm_vector* rhs) { float sum = 0; for (int i=0; i<4; i++) sum += *(rhs->at(i)) * data[i]; return sum; } fm_vector fm_vector::operator* (fm_matrix* rhs) { fm_vector tmp; for (int i=0; i<4; i++) { float sum=0; for (int j=0; j<4; j++) sum += *(rhs->at(j*4 + i)) * data[j]; *(tmp.at(i)) = sum; } return tmp; } void fm_vector::operator= (fm_vector* rhs) { for (int i=0; i<4; i++) data[i] = *(rhs->at(i)); } fm_vector fm_vector::operator/ (float rhs) { fm_vector tmp(data[0]/rhs, data[1]/rhs, data[2]/rhs, data[3]/rhs); return tmp; } fm_vector fm_vector::operator+ (fm_vector* rhs) { fm_vector tmp (false); for (int i=0; i<4; i++) *(tmp.at(i)) = data[i] + *(rhs->at(i)); return tmp; } void fm_vector::display() { for (int i=0; i<4; i++) std::cout << data[i] << " "; std::cout << std::endl; } fm_vector fm_vector::normalise() { float length = sqrtf(data[0]*data[0] + data[1]*data[1] + data[2]*data[2] + data[3]*data[3]); fm_vector result; for (int i=0; i<4; i++) *(result.at(i)) = data[i] / length; return result; }