Zyava
Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору //файл Vector3D.cpp //--------------------------------------------------------------------------- #include "Vector3D.h" #include <stdio.h> //--------------------------------------------------------------------------- #pragma package(smart_init) Vector3D::Vector3D() { x = y = z = 0; } //======================================================================== Vector3D::Vector3D(float v) { x = y = z = v; } //======================================================================== Vector3D::Vector3D(float px, float py, float pz) { x=px; y=py; z=pz; } //======================================================================== Vector3D::Vector3D(const Vector3D& v) { x=v.x; y=v.y; z=v.z; } //======================================================================== Vector3D& Vector3D::operator = (const Vector3D& v) { x=v.x; y=v.y; z=v.z; return *this; } //======================================================================== Vector3D& Vector3D::operator = (float f) { x = y = z = f; return *this; } //======================================================================== Vector3D Vector3D::operator + () const { return *this; } //======================================================================== // оператор инвертирования всех координат вектора Vector3D Vector3D::operator - () const { Vector3D v; v.x=-x; v.y=-y; v.z=-z; return v; } //======================================================================== // оператор увеличения координат одного вектора на координаты другого вектора Vector3D& Vector3D::operator +=(const Vector3D& v) { x+=v.x; y+=v.y; z+=v.z; return *this; } //======================================================================== // оператор уменьшения координат одного вектора из координаты другого вектора Vector3D& Vector3D::operator -=(const Vector3D& v) { x-=v.x; y-=v.y; z-=v.z; return *this; } //======================================================================== // оператор умножения координат одного вектра на координаты другого вектора Vector3D& Vector3D::operator *=(const Vector3D& v) { x*=v.x; y*=v.y; z*=v.z; return *this; } //======================================================================== // оператор умножения координат вектора на число Vector3D& Vector3D::operator *=(float f) { x*=f; y*=f; z*=f; return *this; } //======================================================================== // оператор деления координат вектора на число Vector3D& Vector3D::operator /=(float f) { x/=f; y/=f; z/=f; return *this; } //======================================================================== float& Vector3D::operator [] (int index) { return *(index + &x); } //======================================================================== int Vector3D::operator == (const Vector3D& v) { return x==v.x&&y==v.y&&z==v.z; } //======================================================================== int Vector3D::operator != (const Vector3D& v) { return x!=v.x||y!=v.y||z!=v.z; } //======================================================================== int Vector3D::operator < (float v) { return x < v && y < v && z < v; } //======================================================================== int Vector3D::operator > (float v) { return x > v && y > v && z > v; } //======================================================================== int Vector3D::operator <= (float v) { return x <= v && y <= v && z <= v; } //======================================================================== int Vector3D::operator >= (float v) { return x >= v && y >= v && z >= v; } //======================================================================== // вычисление длины вектора float Vector3D::length () { return (float) sqrt(x*x + y*y + z*z); } //======================================================================== // оператор вычисления длины вектора float Vector3D::operator ! () { return (float) sqrt(x*x + y*y + z*z); } //======================================================================== // оператор сложения векторов Vector3D operator + (const Vector3D& u, const Vector3D& v) { return Vector3D (u.x+v.x,u.y+v.y,u.z+v.z); } //======================================================================== // оператор вычитания векторов Vector3D operator - (const Vector3D& u, const Vector3D& v) { return Vector3D (u.x-v.x,u.y-v.y,u.z-v.z); } //======================================================================== // оператор перемножения векторов Vector3D operator * (const Vector3D& u, const Vector3D& v) { return Vector3D (u.x*v.x,u.y*v.y,u.z*v.z); } //======================================================================== // оператор умножения вектора на число Vector3D operator * (const Vector3D& v, float a) { return Vector3D (v.x*a,v.y*a,v.z*a); } //======================================================================== // оператор умножения числа на вектор Vector3D operator * (float a, const Vector3D& v) { return Vector3D (v.x*a,v.y*a,v.z*a); } //======================================================================== // оператор деления вектора на число Vector3D operator / (const Vector3D& v, float a) { Vector3D t; t.x=v.x/a; t.y=v.y/a; t.z=v.z/a; return t; } //======================================================================== // оператор деления векторов Vector3D operator / (const Vector3D& u, const Vector3D& v) { Vector3D t; t.x=u.x / v.x; t.y=u.y / v.y; t.z=u.z / v.z; return t; } //======================================================================== // оператор скалярного произведения векторов float operator & (const Vector3D& u, const Vector3D& v) { return (u.x*v.x+u.y*v.y+u.z*v.z); } //======================================================================== // векторное произведение Vector3D operator ^ (const Vector3D& u, const Vector3D& v) { return Vector3D (u.y*v.z-u.z*v.y,u.z*v.x-u.x*v.z,u.x*v.y-u.y*v.x); } //======================================================================== // оператор вывода вектора в файл ofstream& operator << (ofstream& f, Vector3D& v) { f<<"[Vector3D]"<<endl; f<<";_x"<<endl; f<<v.x<<endl; f<<";_y"<<endl; f<<v.y<<endl; f<<";_z"<<endl; f<<v.z<<endl; f<<"[/Vector3D]"<<endl; return f; } //======================================================================== // оператор ввода вектора из файла ifstream& operator >> (ifstream& f, Vector3D& v) { char s[256]; f>>s; f>>s; f>>v.x; f>>s; f>>v.y; f>>s; f>>v.z; f>>s; return f; } //======================================================================== // угол между 3d - векторами в градусах float vectorAngle (Vector3D v, Vector3D w) { //скалярное произведение(v,w) = length(v)*length(w)*cos(angle) ==> //angle = acos(скалярное произведение(v,w)/(length(v)*length(w))) if((v.length()==0)||(w.length()==0)) { return 0; } else { return acos( (v&w)/( v.length()*w.length() ) )/M_PI*180; } } //======================================================================== // Нормализация вектора void Vector3D::normalize() { float l = length(); if(l != 0) { x /= l; y /= l; z /= l; } } //======================================================================== Vector3D normalize(Vector3D& v) { v.normalize(); return v; } //======================================================================== float Vector3D::distance(Vector3D v) { return sqrt((v.x - x) * (v.x - x) + (v.y - y) * (v.y - y) + (v.z - z) * (v.z - z)); } //======================================================================== float distance(Vector3D v, Vector3D w) { return sqrt((v.x - w.x) * (v.x - w.x) + (v.y - w.y) * (v.y - w.y) + (v.z - w.z) * (v.z - w.z)); } //======================================================================== void Vector3D::CreateVector(Vector3D endPnt) { x = endPnt.x - x; y = endPnt.y - y; z = endPnt.z - z; } //======================================================================== |