//************************************************************************* // // 3D Vector osztály // // Szirmay-Kalos Laszlo, 2002. November. //************************************************************************* // #ifndef VECTOR_H #define VECTOR_H #include //=============================================================== class Vector { //=============================================================== public: float x, y, z,w; // a Descartes koordináták Vector( ) { x = y = z = 0.0; } Vector( float x0, float y0, float z0, float w0 = 1.0 ) { x = x0; y = y0; z = z0;w=w0; } Vector operator+( const Vector& v ) { // két vektor összege float X = x + v.x, Y = y + v.y, Z = z + v.z, W=w+v.w; return Vector(X, Y, Z,W); } Vector operator-( const Vector& v ) { float X = x - v.x, Y = y - v.y, Z = z - v.z,W=w-v.w; return Vector(X, Y, Z,W); } Vector operator*( float f ) { // vektor és szám szorzata return Vector( x * f, y * f, z * f ,w*f); } float operator*( const Vector& v ) { // két vektor skaláris szorzata return (x * v.x + y * v.y + z * v.z); } Vector operator%( const Vector& v ) { // két vektor vektoriális szorzata float X = y * v.z - z * v.y, Y = z * v.x - x * v.z, Z = x * v.y - y * v.x; return Vector(X, Y, Z); } float Length( ) { // vektor abszolút értéke return (float)sqrt( x * x + y * y + z * z ); } void operator+=( const Vector& v ) { // vektor összeadás x += v.x; y += v.y; z += v.z;w+=v.w; } void operator-=( const Vector& v ) { // vektor különbség x -= v.x; y -= v.y; z -= v.z;w-=v.w; } void operator*=( float f ) { // vektor és szám szorzata x *= f; y *= f; z *= f;w*=f; } Vector operator/( float f ) { // vektor osztva egy számmal return Vector( x/f, y/f, z/f ,w/f); } Vector Normalize( ) { // vektor normalizálása float l = Length( ); if ( l < 0.000001f) { x = 1; y = 0; z = 0; } else { x /= l; y /= l; z /= l; return *this;} } Vector UnitVector( ) { // egy vektorral párhuzamos egységvektor Vector r = * this; r.Normalize(); return r; } Vector Rotate( Vector& axis, float angle ) { // vektor forgatása egy tengely körül Vector iv = this -> UnitVector(); Vector jv = axis.UnitVector() % this -> UnitVector(); float radian = angle * M_PI/180; return (iv * cos(radian) + jv * sin(radian)); } float * GetArray() { return &x; } float * GetArrayf() { return &x;} float& X() { return x; } float& Y() { return y; } float& Z() { return z; } float& W() { return w; } }; //-------------------------------------------- class Matrix { //-------------------------------------------- public: float m[4][4]; Matrix( ) { } Matrix( float d1, float d2, float d3 ) { Clear(); m[0][0] = d1; m[1][1] = d2; m[2][2] = d3; } void Clear( ) { memset( &m[0][0], 0, sizeof( m ) ); } Vector operator*( const Vector& v ) { return Vector(m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z, m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z, m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z); } Matrix operator*( const Matrix& mat ) { Matrix result; for( int i = 0; i < 3; i++ ) for( int j = 0; j < 3; j++ ) { result.m[i][j] = 0; for( int k = 0; k < 3; k++ ) result.m[i][j] += m[i][k] * mat.m[k][j]; } return result; } Matrix Transpose( ) { Matrix result; for( int i = 0; i < 3; i++ ) for( int j = 0; j < 3; j++ ) result.m[j][i] = m[i][j]; return result; } Vector Transform( Vector& v ) { return Vector( v.x * m[0][0] + v.y * m[1][0] + v.z * m[2][0] + m[3][0], v.x * m[0][1] + v.y * m[1][1] + v.z * m[2][1] + m[3][1], v.x * m[0][2] + v.y * m[1][2] + v.z * m[2][2] + m[3][2]); } float * GetArray() { return &m[0][0]; } }; #endif