1 // marVector.cpp: implementation of the marVector class.
3 //////////////////////////////////////////////////////////////////////
9 //////////////////////////////////////////////////////////////////////
11 //////////////////////////////////////////////////////////////////////
12 marVector::marVector(size_t s)
28 marVector::marVector(const marVector &v)
32 _data=new double[_size];
40 marVector::marVector(double*v,size_t s)
47 // PS -> _data=new double[_size];
48 // PS -> for (int i=0;i<_size;i++)
50 // PS -> _data[i]=v[i];
63 //////////////////////////////////////////////////////////////////////
65 //////////////////////////////////////////////////////////////////////
66 marVector::~marVector()
78 //////////////////////////////////////////////////////////////////////
80 //////////////////////////////////////////////////////////////////////
81 // ---------------------------------------------------------------------
83 std::ostream& operator<<(std::ostream& os,const marVector& v)
86 for(i=0;i < v.size();i++)
94 // ---------------------------------------------------------------------
96 marVector::operator double*() const
101 // ---------------------------------------------------------------------
103 double& marVector::operator()(size_t i)
108 const double& marVector::operator()(size_t i) const
113 // ---------------------------------------------------------------------
115 marVector& marVector::operator=(const marVector& o)
118 if (!(_data==NULL)&&(!shallowCopy))
123 _data=new double[_size];
125 for (i=0;i<_size;i++)
132 marVector& marVector::operator=(double o)
136 if (!(_data==NULL)&&(!shallowCopy))
141 _data=new double[_size];
143 for (i=0;i<_size;i++)
155 marVector& marVector::operator=(double*o)
159 if (!(_data==NULL)&&(!shallowCopy))
164 _data=new double[_size];
166 for (i=0;i<_size;i++)
178 // ---------------------------------------------------------------------
180 bool marVector::operator==(const marVector& o) const
190 for(i=0;i<_size && equal;i++)
192 equal=equal && (_data[i]==o._data[i]);
197 bool marVector::operator!=(const marVector& o) const
199 return(!((*this)==o));
202 // ---------------------------------------------------------------------
204 marVector marVector::operator+(const marVector& o)
206 marVector result(*this);
207 size_t s=result._size;
209 if ((o._size!=s) || (s==0))
215 for (int i=0;i < s;i++)
217 result._data[i] +=o._data[i];
223 marVector marVector::operator+(double o)
225 marVector result(*this);
226 size_t s=result._size;
234 for (int i=0;i < s;i++)
242 marVector marVector::operator+(double*o)
244 marVector result(*this);
245 size_t s=result._size;
253 for (int i=0;i < s;i++)
255 result._data[i] +=o[i];
261 // ---------------------------------------------------------------------
262 /*Addition + Affectation*/
263 marVector& marVector::operator+=(const marVector& o)
265 if ((o._size!=_size) || (_size==0))
271 for (int i=0;i < _size;i++)
273 _data[i] +=o._data[i];
279 marVector& marVector::operator+=(double o)
287 for (int i=0;i < _size;i++)
295 marVector& marVector::operator+=(double*o)
303 for (int i=0;i < _size;i++)
311 // ---------------------------------------------------------------------
313 marVector marVector::operator-(const marVector& o)
315 marVector result(*this);
316 size_t s=result._size;
318 if ((o._size !=s) || (s==0))
324 for (int i=0;i < s;i++)
326 result._data[i] -=o._data[i];
332 marVector marVector::operator-(double o)
334 marVector result(*this);
335 size_t s=result._size;
343 for (int i=0;i < s;i++)
351 marVector marVector::operator-(double*o)
353 marVector result(*this);
354 size_t s=result._size;
362 for (int i=0;i < s;i++)
364 result._data[i] -=o[i];
370 // ---------------------------------------------------------------------
371 /*Sooustraction + Affection*/
372 marVector& marVector::operator-=(const marVector& o)
374 if ((o._size!=_size) || (_size==0))
380 for (int i=0;i < _size;i++)
382 _data[i] -=o._data[i];
388 marVector& marVector::operator-=(double o)
396 for (int i=0;i < _size;i++)
404 marVector& marVector::operator-=(double*o)
412 for (int i=0;i < _size;i++)
420 // ---------------------------------------------------------------------
421 /*Multiplication (produit scalaire)*/
422 marVector marVector::operator*(double o)
424 marVector result(*this);
425 size_t s=result._size;
433 for (int i=0;i < s;i++)
441 // ---------------------------------------------------------------------
442 /*Multiplication (produit scalaire) + Affectation*/
443 marVector& marVector::operator*=(double o)
451 for (int i=0;i < _size;i++)
459 // ---------------------------------------------------------------------
460 /*Division (division scalaire)*/
461 marVector marVector::operator/(double o)
463 marVector result(*this);
464 size_t s=result._size;
472 for (int i=0;i < s;i++)
480 // ---------------------------------------------------------------------
481 /*Division (division scalaire) + Affectation*/
482 marVector& marVector::operator/=(double o)
490 for (int i=0;i < _size;i++)
498 //////////////////////////////////////////////////////////////////////
500 //////////////////////////////////////////////////////////////////////
501 // ---------------------------------------------------------------------
503 double marVector::dot(const marVector& o)
506 if ((_size!=o._size) || (_size==0))
513 for (int i=0;i<_size;i++)
515 result+=(_data[i]*o._data[i]);
521 double marVector::dot(double*o)
531 for (int i=0;i<_size;i++)
533 result+=(_data[i]*o[i]);
539 // ---------------------------------------------------------------------
540 /*Produit vectoriel*/
541 marVector marVector::cross(const marVector& o)
543 marVector result(*this);
544 if ((o._size!=_size) || (_size!=3))
553 S=_data[1]*o._data[2];
554 s=_data[2]*o._data[1];
555 result._data[0]=S - s;
558 S=_data[2]*o._data[0];
559 s=_data[0]*o._data[2];
560 result._data[1]=S - s;
563 S=_data[0]*o._data[1];
564 s=_data[1]*o._data[0];
565 result._data[2]=S - s;
570 marVector marVector::cross(double*o)
572 marVector result(*this);
584 result._data[0]=S - s;
589 result._data[1]=S - s;
594 result._data[2]=S - s;
599 int marVector::scross(const marVector& o)
601 if ((o._size!=_size) && (_size!=3))
612 int marVector::scross(double*o)
625 // ---------------------------------------------------------------------
626 /*Norme euclidienne*/
627 double marVector::norm2()
628 // Calcule la norme euclidienne du vecteur
629 // en utilisant l'agorithme de Blue
639 const double seuil1=pow( 2., 154. ),seuil2=1/seuil1;
640 double n1=0; /* les sommes partielles */
645 for ( i=0; i<_size; i++ )
647 double x=_data[i]; /* x=abs(vecteur[i]) */
653 /* sommation par classe */
659 else if ( x < seuil2 )
673 n4=seuil1 * sqrt(n1);
677 n4=seuil2 * sqrt(n2);
685 norme2=n4 * sqrt( 1 + n3*n3 );
690 norme2=n3 * sqrt( 1 + n4*n4 );
698 // ---------------------------------------------------------------------
700 marVector marVector::normalize( )
702 marVector result=marVector(*this);
703 result *= (1/result.norm2());
707 int marVector::snormalize( )
709 (*this)*=(1/this->norm2());
711 }// renvoie 0 si OK, 1 sinon
713 //////////////////////////////////////////////////////////////////////
715 //////////////////////////////////////////////////////////////////////
717 size_t marVector::size() const