// marVector.cpp: implementation of the marVector class. // ////////////////////////////////////////////////////////////////////// #include "marVector.h" #include #include ////////////////////////////////////////////////////////////////////// // Constructeurs ////////////////////////////////////////////////////////////////////// marVector::marVector(size_t s) :shallowCopy(false) { if (s!=0) { _data=new double[s]; _size=s; } else { _data=NULL; _size=0; assert(false); } } marVector::marVector(const marVector &v) :shallowCopy(false) { _size=v._size; _data=new double[_size]; int i; for (i=0;i<_size;i++) { _data[i]=v._data[i]; } } marVector::marVector(double*v,size_t s) :shallowCopy(true) { if (s!=0) { _size=s; _data=v; // PS -> _data=new double[_size]; // PS -> for (int i=0;i<_size;i++) // PS -> { // PS -> _data[i]=v[i]; // PS -> } } else { _data=NULL; _size=0; assert(false); } } ////////////////////////////////////////////////////////////////////// // Destructeur ////////////////////////////////////////////////////////////////////// marVector::~marVector() { if (!shallowCopy) { delete _data; } else { _data=NULL; } } ////////////////////////////////////////////////////////////////////// // Opérateurs ////////////////////////////////////////////////////////////////////// // --------------------------------------------------------------------- /*Affichage*/ std::ostream& operator<<(std::ostream& os,const marVector& v) { int i; for(i=0;i < v.size();i++) { os << " " << v(i); } os <<"\n"; return(os); } // --------------------------------------------------------------------- /*Casting*/ marVector::operator double*() const { return(_data); } // --------------------------------------------------------------------- /*Indexation*/ double& marVector::operator()(size_t i) { return(_data[i]); } const double& marVector::operator()(size_t i) const { return(_data[i]); } // --------------------------------------------------------------------- /*Affectation*/ marVector& marVector::operator=(const marVector& o) { _size=o._size; if (!(_data==NULL)&&(!shallowCopy)) { delete _data; } shallowCopy=false; _data=new double[_size]; int i; for (i=0;i<_size;i++) { _data[i]=o._data[i]; } return (*this); } marVector& marVector::operator=(double o) { if (_size!=0) { if (!(_data==NULL)&&(!shallowCopy)) { delete _data; } shallowCopy=false; _data=new double[_size]; int i; for (i=0;i<_size;i++) { _data[i]=o; } } else { assert(false); } return (*this); } marVector& marVector::operator=(double*o) { if (_size!=0) { if (!(_data==NULL)&&(!shallowCopy)) { delete _data; } shallowCopy=false; _data=new double[_size]; int i; for (i=0;i<_size;i++) { _data[i]=o[i]; } } else { assert(false); } return (*this); } // --------------------------------------------------------------------- /*Comparaison*/ bool marVector::operator==(const marVector& o) const { bool equal=true; if(_size!=o._size) { return(false); } int i; for(i=0;i<_size && equal;i++) { equal=equal && (_data[i]==o._data[i]); } return(equal); } bool marVector::operator!=(const marVector& o) const { return(!((*this)==o)); } // --------------------------------------------------------------------- /*Addition*/ marVector marVector::operator+(const marVector& o) { marVector result(*this); size_t s=result._size; if ((o._size!=s) || (s==0)) { assert(false); } else { for (int i=0;i < s;i++) { result._data[i] +=o._data[i]; } } return result; } marVector marVector::operator+(double o) { marVector result(*this); size_t s=result._size; if (s==0) { assert(false); } else { for (int i=0;i < s;i++) { result._data[i] +=o; } } return result; } marVector marVector::operator+(double*o) { marVector result(*this); size_t s=result._size; if (s==0) { assert(false); } else { for (int i=0;i < s;i++) { result._data[i] +=o[i]; } } return result; } // --------------------------------------------------------------------- /*Addition + Affectation*/ marVector& marVector::operator+=(const marVector& o) { if ((o._size!=_size) || (_size==0)) { assert(false); } else { for (int i=0;i < _size;i++) { _data[i] +=o._data[i]; } } return (*this); } marVector& marVector::operator+=(double o) { if (_size==0) { assert(false); } else { for (int i=0;i < _size;i++) { _data[i] +=o; } } return(*this); } marVector& marVector::operator+=(double*o) { if (_size==0) { assert(false); } else { for (int i=0;i < _size;i++) { _data[i] +=o[i]; } } return(*this); } // --------------------------------------------------------------------- /*Soustraction*/ marVector marVector::operator-(const marVector& o) { marVector result(*this); size_t s=result._size; if ((o._size !=s) || (s==0)) { assert(false); } else { for (int i=0;i < s;i++) { result._data[i] -=o._data[i]; } } return result; } marVector marVector::operator-(double o) { marVector result(*this); size_t s=result._size; if (s==0) { assert(false); } else { for (int i=0;i < s;i++) { result._data[i] -=o; } } return result; } marVector marVector::operator-(double*o) { marVector result(*this); size_t s=result._size; if (s==0) { assert(false); } else { for (int i=0;i < s;i++) { result._data[i] -=o[i]; } } return result; } // --------------------------------------------------------------------- /*Sooustraction + Affection*/ marVector& marVector::operator-=(const marVector& o) { if ((o._size!=_size) || (_size==0)) { assert(false); } else { for (int i=0;i < _size;i++) { _data[i] -=o._data[i]; } } return (*this); } marVector& marVector::operator-=(double o) { if (_size==0) { assert(false); } else { for (int i=0;i < _size;i++) { _data[i] -=o; } } return(*this); } marVector& marVector::operator-=(double*o) { if (_size==0) { assert(false); } else { for (int i=0;i < _size;i++) { _data[i] -=o[i]; } } return(*this); } // --------------------------------------------------------------------- /*Multiplication (produit scalaire)*/ marVector marVector::operator*(double o) { marVector result(*this); size_t s=result._size; if (s==0) { assert(false); } else { for (int i=0;i < s;i++) { result._data[i]*=o; } } return result; } // --------------------------------------------------------------------- /*Multiplication (produit scalaire) + Affectation*/ marVector& marVector::operator*=(double o) { if (_size==0) { assert(false); } else { for (int i=0;i < _size;i++) { _data[i]*=o; } } return(*this); } // --------------------------------------------------------------------- /*Division (division scalaire)*/ marVector marVector::operator/(double o) { marVector result(*this); size_t s=result._size; if (s==0) { assert(false); } else { for (int i=0;i < s;i++) { result._data[i] /=o; } } return result; } // --------------------------------------------------------------------- /*Division (division scalaire) + Affectation*/ marVector& marVector::operator/=(double o) { if (_size==0) { assert(false); } else { for (int i=0;i < _size;i++) { _data[i] /=o; } } return(*this); } ////////////////////////////////////////////////////////////////////// // Opérations ////////////////////////////////////////////////////////////////////// // --------------------------------------------------------------------- /*Produit scalaire*/ double marVector::dot(const marVector& o) { double result; if ((_size!=o._size) || (_size==0)) { assert(false); } else { result=0.0; for (int i=0;i<_size;i++) { result+=(_data[i]*o._data[i]); } } return result; } double marVector::dot(double*o) { double result; if (_size==0) { assert(false); } else { result=0.0; for (int i=0;i<_size;i++) { result+=(_data[i]*o[i]); } } return result; } // --------------------------------------------------------------------- /*Produit vectoriel*/ marVector marVector::cross(const marVector& o) { marVector result(*this); if ((o._size!=_size) || (_size!=3)) { assert(false); } else { double S,s; // 1st element S=_data[1]*o._data[2]; s=_data[2]*o._data[1]; result._data[0]=S - s; // 2nd element S=_data[2]*o._data[0]; s=_data[0]*o._data[2]; result._data[1]=S - s; // 3rd element S=_data[0]*o._data[1]; s=_data[1]*o._data[0]; result._data[2]=S - s; } return(result); } marVector marVector::cross(double*o) { marVector result(*this); if (_size!=3) { assert(false); } else { double S,s; // 1st element S=_data[1]*o[2]; s=_data[2]*o[1]; result._data[0]=S - s; // 2nd element S=_data[2]*o[0]; s=_data[0]*o[2]; result._data[1]=S - s; // 3rd element S=_data[0]*o[1]; s=_data[1]*o[0]; result._data[2]=S - s; } return(result); } int marVector::scross(const marVector& o) { if ((o._size!=_size) && (_size!=3)) { return (1); } else { *this=cross(o); return(0); } } int marVector::scross(double*o) { if (_size!=3) { return (1); } else { *this=cross(o); return(0); } } // --------------------------------------------------------------------- /*Norme euclidienne*/ double marVector::norm2() // Calcule la norme euclidienne du vecteur // en utilisant l'agorithme de Blue { double norme2=0.0; if (_size==0) { assert(false); } else { const double seuil1=pow( 2., 154. ),seuil2=1/seuil1; double n1=0; /* les sommes partielles */ double n2=0; double n3=0; double n4; int i; for ( i=0; i<_size; i++ ) { double x=_data[i]; /* x=abs(vecteur[i]) */ if (x<0) { x=-x; } /* sommation par classe */ if ( x > seuil1 ) { x *=seuil2; n1 +=x*x; } else if ( x < seuil2 ) { x *=seuil1; n2 +=x*x; } else { n3 +=x*x; } } n3=sqrt(n3); if (n1>0) { n4=seuil1 * sqrt(n1); } else { n4=seuil2 * sqrt(n2); } // EED /* if (n3 < n4) { n3 /=n4; norme2=n4 * sqrt( 1 + n3*n3 ); } else { n4 /=n3; norme2=n3 * sqrt( 1 + n4*n4 ); } */ norme2=n3; } return norme2; } // --------------------------------------------------------------------- /*Normalisation*/ marVector marVector::normalize( ) { marVector result=marVector(*this); result *= (1/result.norm2()); return result; } int marVector::snormalize( ) { (*this)*=(1/this->norm2()); return(0); }// renvoie 0 si OK, 1 sinon ////////////////////////////////////////////////////////////////////// // Méthodes ////////////////////////////////////////////////////////////////////// size_t marVector::size() const { return _size; }