#pragma once //************************************************************************* // // 3D Vector osztály // // Szirmay-Kalos László, 2003. Május. //************************************************************************* // #ifndef VECTOR_H #define VECTOR_H #define M_PI 3.14159265 //=============================================================== class Vector { //=============================================================== public: float x, y, z; // a Descartes koordináták Vector( ) { x = y = z = 0.0; } Vector( float x0, float y0, float z0 ) { x = x0; y = y0; z = z0; } Vector operator+( const Vector& v ) { // két vektor összege float X = x + v.x, Y = y + v.y, Z = z + v.z; return Vector(X, Y, Z); } Vector operator-( const Vector& v ) { // két vektor különbsége float X = x - v.x, Y = y - v.y, Z = z - v.z; return Vector(X, Y, Z); } Vector operator*( float f ) { // vektor és szám szorzata return Vector( x * f, y * f, z * 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; } void operator-=( const Vector& v ) { // vektor különbség x -= v.x; y -= v.y; z -= v.z; } void operator*=( float f ) { // vektor és szám szorzata x *= f; y *= f; z *= f; } void operator/=( float f ) { // vektor és szám szorzata x /= f; y /= f; z /= f; } Vector operator/( float f ) { // vektor osztva egy számmal return Vector( x/f, y/f, z/f ); } void Min( Vector& v ) { // vektor osztva egy számmal if (x > v.x) x = v.x; if (y > v.y) x = v.y; if (z > v.z) x = v.z; } void Max( Vector& v ) { // vektor osztva egy számmal if (x < v.x) x = v.x; if (y < v.y) x = v.y; if (z < v.z) x = v.z; } void 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; } } 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 = (float)(angle * M_PI/180); return (iv * (float)cos(radian) + jv * (float)sin(radian)); } float * GetArray() { return &x; } float& X() { return x; } float& Y() { return y; } float& Z() { return z; } }; //=============================================================== class Matrix { //=============================================================== public: float m[4][4]; Matrix( ) { Clear(); } 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 ) ); } void LoadIdentity( ) { // a mátrix legyen egységmátrix Clear(); m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1; } 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 operator/( const float d ) { Matrix result; for( int i = 0; i < 3; i++ ) for( int j = 0; j < 3; j++ ) { result.m[i][j] = m[i][j] / d; } 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]; } }; //ostream& operator<<( ostream& s, Vector& v ); #endif