#81
10 января 2009 в 13:46
Ну, раз так, то лучше предъявлю сам код класса. Зачем нужно деление, сам бы хотел знать =)<br /><br /><br /><br />/****************************************************************************<br /> Класс трехмерного вектора Vector<br />****************************************************************************/<br /><br />class isVector<br />{<br /> public: //Все члены класса публичны по умолчанию<br /><br /> //=======================================================================<br /> // Данные вектора - переменные x, y и z<br /> //=======================================================================<br /><br /> float x, y, z;<br /><br /> //=======================================================================<br /> // Конструкторы вектора<br /> //=======================================================================<br /><br /> eFxp isVector( void ){} //Стандартный конструктор класса<br /> eFxp isVector( float x, float y, float z ){} //Назначаем данные классу<br /><br /> //=======================================================================<br /> // Операторы вектора<br /> //=======================================================================<br /><br /> eFxp const float operator[]( int index ) const<br /> {<br /> return (&x)[ index ];<br /> }<br /><br /> eFxp float operator[]( int index )<br /> {<br /> return (&x)[ index ];<br /> }<br /><br /> //=======================================================================<br /> // Операции с флоатами<br /> //=======================================================================<br /><br /> eFxp isVector operator+ ( float tVar ) const //Складываем с флоатом<br /> {<br /> return isVector( x + tVar, y + tVar, z + tVar );<br /> }<br /><br /> eFxp isVector operator- ( float tVar ) const //Из вектора вычитаем флоат<br /> {<br /> return isVector( x - tVar, y - tVar, z - tVar );<br /> }<br /><br /> eFxp isVector operator* ( float tVar ) const //Умножаем вектор на флоат<br /> {<br /> return isVector( x * tVar, y * tVar, z * tVar );<br /> }<br /><br /> eFxp isVector operator/ ( float tVar ) const //Делим вектор на флоат<br /> {<br /> return isVector( x / tVar, y / tVar, z / tVar );<br /> }<br /><br /> //<br /><br /> eFxp isVector operator*=( const float tVar )<br /> {<br /> return isVector( x *= tVar, y *= tVar, z *= tVar );<br /> }<br /><br /> eFxp isVector operator/=( const float tVar )<br /> {<br /> return isVector( x /= tVar, y /= tVar, z /=tVar );<br /> }<br /><br /> eFxp isVector operator+=( const float tVar )<br /> {<br /> return isVector( x += tVar, y += tVar, z += tVar );<br /> }<br /><br /> eFxp isVector operator-=( const float tVar )<br /> {<br /> return isVector( x -= tVar, y -= tVar, z -= tVar );<br /> }<br /><br /> //=======================================================================<br /> // Операции с другими трехмерными векторами<br /> //=======================================================================<br /><br /> eFxp isVector operator+ ( isVector& tVec ) const<br /> {<br /> return isVector( x + tVec.x, y + tVec.y, z + tVec.z ); //Складываем два вектора по элементам<br /> }<br /><br /> eFxp isVector operator- ( isVector& tVec ) const<br /> {<br /> return isVector( x - tVec.x, y - tVec.y, z - tVec.z ); //Вычитаем два вектора по элементам<br /> }<br /><br /> eFxp isVector operator* ( isVector& tVec ) const<br /> {<br /> return isVector( x * tVec.x, y * tVec.y, z * tVec.z ); //Умножаем поэлементно два вектора<br /> }<br /><br /> eFxp isVector operator/ ( isVector& tVec ) const<br /> {<br /> return isVector( x / tVec.x, y / tVec.y, z / tVec.z ); //Поэлементное деление векторов<br /> }<br /><br /> eFxp float operator/ ( isVector& tVec )<br /> {<br /> return ((x * x + y * y + z * z) / (tVec.x * tVec.x + tVec.y * tVec.y + tVec.z * tVec.z)); //Деление длин векторов<br /> }<br /><br /> //<br /><br /> eFxp isVector operator*=( const isVector& tVec )<br /> {<br /> return isVector( x *= tVec.x, y *= tVec.y, z *= tVec.z );<br /> }<br /><br /> eFxp isVector operator/=( const isVector& tVec )<br /> {<br /> return isVector( x /= tVec.x, y /= tVec.y, z /= tVec.z );<br /> }<br /><br /> eFxp isVector operator+=( const isVector& tVec )<br /> {<br /> return isVector( x += tVec.x, y += tVec.y, z += tVec.z );<br /> }<br /><br /> eFxp isVector operator-=( const isVector& tVec )<br /> {<br /> return isVector( x -= tVec.x, y -= tVec.y, z -= tVec.z );<br /> }<br /><br /> //=======================================================================<br /> // Операции другого типа<br /> //=======================================================================<br /><br /> eFxp float operator* ( const isVector& tVec ) const<br /> {<br /> return x * tVec.x + y * tVec.y + z * tVec.z;<br /> }<br /><br /> //=======================================================================<br /> // Операции над самим собой<br /> //=======================================================================<br /><br /> eFxp isVector operator- () const<br /> {<br /> return isVector( -x, -y, -z ); //Инвертируем вектор<br /> }<br /><br /> eFxp isVector operator* () const<br /> {<br /> return isVector( x * x, y * y, z * z ); //Умножаем вектор сам на себя<br /> }<br /><br /> //=======================================================================<br /> // Процедуры<br /> //=======================================================================<br /> eFxp void CrossProduct ( isVector& tVec1, isVector& tVec2, isVector& tVecR ); //Скалярное произведение<br /> eFxp float Lenght ( isVector& tVec ) const; //Длина вектора<br /> eFxp float LenghtSquared ( isVector& tVec ) const; //Квадратная длина вектора<br /> eFxp void Get (isVector& tVec); //Получаем наш вектор<br /> eFxp float Normalize(); //Нормализуем вектор<br /> eFxp void Scale(isVector& tVec1, isVector& tVecR, float Scale); //Проводим изменение размеров вектора<br /> eFxp void UnScale(isVector& tVec1, isVector& tVec2, float Scale); //Изменение размеров вектора по методу деления вектора на вектор<br /> eFxp void Add(isVector& tVec1, isVector& tVec2, isVector& tVecR); //Сложение векторов<br /> eFxp void Subtract(isVector& tVec1, isVector& tVec2, isVector& tVecR); //Вычитание векторов<br /> eFxp void AddScaled(isVector& tVec1, isVector& tVec2, float Scale, isVector& tVecR); //Сложение со скалированием<br /> eFxp void AddUnScaled(isVector& tVec1, isVector& tVec2, float Scale, isVector& tVecR); //Сложение с дескалированием<br /> eFxp void SubScaled(isVector& tVec1, isVector& tVec2, float Scale, isVector& tVecR); //Вычитание со скалированием<br /> eFxp void SubUnScaled(isVector& tVec1, isVector& tVec2, float Scale, isVector& tVecR); //Вычитание с дескалированием<br /> eFxp void Copy(isVector& tVecSrc, isVector& tVecDst); //Копирование вектора<br /> eFxp void Inverse(isVector& tVec); //Инверсия вектора<br /> eFxp void InverseCopy (isVector& tVecSrc, isVector& tVecDst); //Копирование инвертированного вектора<br /> eFxp float Distance (isVector& tVec1, isVector& tVec2); //Расстояние между векторами<br />};<br /><br />eFxp void isVector::CrossProduct(isVector& tVec1, isVector& tVec2, isVector& tVecR )<br />{<br /> tVecR.x = tVec1.y * tVec2.z - tVec1.z * tVec2.y;<br /> tVecR.y = tVec1.z * tVec2.x - tVec1.x * tVec2.z;<br /> tVecR.z = tVec1.x * tVec2.y - tVec1.y * tVec2.x;<br />}<br /><br />eFxp float isVector::Lenght(isVector &tVec) const<br />{<br /> return sqrt (x * x + y * y + z * z);<br />}<br /><br />eFxp float isVector::LenghtSquared(isVector &tVec) const<br />{<br /> return x * x + y * y + z * z;<br />}<br /><br />eFxp void isVector::Get(isVector &tVec)<br />{<br /> x = tVec.x;<br /> y = tVec.y;<br /> z = tVec.z;<br />}<br /><br />eFxp float isVector::Normalize()<br /> {<br /> float OneOverDist, Dist;<br /> Dist = sqrt( x * x + y * y + z * z );<br /><br /> if (Dist == 0.0) return 0.0f;<br /> OneOverDist = 1.0f/Dist;<br /> <br /> x *= OneOverDist;<br /> y *= OneOverDist;<br /> z *= OneOverDist;<br /> return Dist;<br /> }<br /><br />eFxp void isVector::Add(isVector &tVec1, isVector &tVec2, isVector &tVecR)<br />{<br /> tVecR = tVec1 + tVec2;<br />}<br /><br />eFxp void isVector::Subtract(isVector &tVec1, isVector &tVec2, isVector &tVecR)<br />{<br /> tVecR = tVec1 - tVec2;<br />}<br /><br />eFxp void isVector::Scale(isVector &tVec1, isVector &tVecR, float Scale)<br />{<br /> tVecR = tVec1 * Scale;<br />}<br /><br />eFxp void isVector::AddScaled(isVector &tVec1, isVector &tVec2, float Scale, isVector &tVecR)<br />{<br /> tVecR = tVec1 + ( tVec2 * Scale );<br />}<br /><br />eFxp void isVector::AddUnScaled(isVector &tVec1, isVector &tVec2, float Scale, isVector &tVecR)<br />{<br /> tVecR = tVec1 + ( tVec2 / Scale );<br />}<br /><br />eFxp void isVector::SubScaled(isVector &tVec1, isVector &tVec2, float Scale, isVector &tVecR)<br />{<br /> tVecR = tVec1 - ( tVec2 * Scale );<br />}<br /><br />eFxp void isVector::SubUnScaled(isVector &tVec1, isVector &tVec2, float Scale, isVector &tVecR)<br />{<br /> tVecR = tVec1 - ( tVec2 / Scale );<br />}<br /><br />eFxp void isVector::Copy(isVector &tVecSrc, isVector &tVecDst)<br />{<br /> tVecDst = tVecSrc;<br />}<br /><br />eFxp void isVector::Inverse(isVector &tVec)<br />{<br /> tVec = -tVec;<br />}<br /><br />eFxp void isVector::InverseCopy(isVector &tVecSrc, isVector &tVecDst)<br />{<br /> tVecDst = -tVecSrc;<br />}<br /><br />eFxp void isVector::UnScale(isVector &tVec1, isVector &tVec2, float Scale)<br />{<br /> tVec2 = tVec1 / Scale;<br />}<br /><br />eFxp float isVector::Distance(isVector &tVec1, isVector &tVec2)<br /> {<br /> isVector tVecR;<br /> Subtract ( tVec1, tVec2, tVecR );<br /> return Lenght( tVecR );<br /> }<br /><br /><br /><br />eFxp - #define eFxp _declspec(dllexport) __forceinline