Allink  v0.1
MatematicaVect.cpp
00001 #include "../include/Matematica.h"
00002 Vettore::Vettore(int N){
00003   x = NULL;
00004   if(N<0)return;
00005   NDim = N;
00006   //x = (double *)calloc(NDim,sizeof(double));
00007   x = new double[NDim];
00008 }
00009 Vettore::Vettore(){
00010   x = NULL;
00011   NDim = 3;
00012   //x = (double *)calloc(NDim,sizeof(double));
00013   x = new double[NDim];
00014 }
00015 Vettore::Vettore(double *Pos,int N){
00016   x = NULL;
00017   NDim = N;
00018   x = new double[NDim];
00019     //  x = (double *)calloc(NDim,sizeof(double));
00020   for(int d=0;d<3;d++)
00021     x[d] = Pos[d];
00022 };
00023 Vettore::Vettore(double xx,double yy){
00024   x = NULL;
00025   NDim = 2;
00026   x = new double[NDim];
00027   //  x = (double *)calloc(NDim,sizeof(double));
00028   x[0] = xx;
00029   x[1] = yy;
00030 }
00031 Vettore::Vettore(double xx,double yy,double zz){
00032   x = NULL;
00033   NDim = 3;
00034   x = new double[NDim];
00035   //  x = (double *)calloc(NDim,sizeof(double));
00036   x[0] = xx;
00037   x[1] = yy;
00038   x[2] = zz;
00039 }
00040 Vettore::~Vettore(){
00041   if(x) delete [] x;
00042   //if(x) free(x);
00043 }
00044 Vettore Vettore::operator+(const Vettore &u){
00045   assert(NDim == u.NDim);
00046   Vettore Resp(this->NDim);
00047   for(int d=0;d<this->NDim;d++){
00048     Resp.x[d] = this->x[d] + u.x[d];
00049   }
00050   return Resp;
00051 }
00052 Vettore Vettore::operator+(const Vettore &u) const{
00053   assert(NDim == u.NDim);
00054   Vettore Resp(this->NDim);
00055   for(int d=0;d<this->NDim;d++){
00056     Resp.x[d] = this->x[d] + u.x[d];
00057   }
00058   return Resp;
00059 }
00060 Vettore& Vettore::operator+=(const Vettore &u){
00061   for(int d=0;d<this->NDim;d++){
00062     this->x[d] += u.x[d];
00063   }
00064   return *this;
00065 }
00066 Vettore Vettore::operator-(const Vettore &u){
00067   Vettore Resp(this->NDim);
00068   for(int d=0;d<this->NDim;d++){
00069     Resp.x[d] = this->x[d] - u.x[d];
00070   }
00071   return Resp;
00072 }
00073 Vettore Vettore::operator-(const Vettore &u) const{
00074   Vettore Resp(this->NDim);
00075   for(int d=0;d<this->NDim;d++){
00076     Resp.x[d] = this->x[d] - u.x[d];
00077   }
00078   return Resp;
00079 }
00080 Vettore& Vettore::operator-=(const Vettore &u){
00081   for(int d=0;d<this->NDim;d++){
00082     this->x[d] -= u.x[d];
00083   }
00084   return *this;
00085 }
00086 Vettore Vettore::operator*(const Vettore &u){
00087   assert(NDim == u.NDim);
00088   Vettore Resp(this->NDim);
00089   for(int d=0;d<this->NDim;d++){
00090     Resp.x[d] = this->x[d] * u.x[d];
00091   }
00092   return Resp;
00093 }
00094 Vettore& Vettore::operator*=(const Vettore &u){
00095   for(int d=0;d<this->NDim;d++){
00096     this->x[d] *= u.x[d];
00097   }
00098   return *this;
00099 }
00100 Vettore Vettore::operator*(const double Fact){
00101   Vettore Resp(this->NDim);
00102   for(int d=0;d<this->NDim;d++){
00103     Resp.x[d] = this->x[d]*Fact;
00104   }
00105   return Resp;
00106 }
00107 Vettore& Vettore::operator*=(const double Fact){
00108   Vettore Resp(this->NDim);
00109   for(int d=0;d<this->NDim;d++){
00110     this->x[d] *= Fact;
00111   }
00112   return *this;
00113 }
00114 //inline 
00115 Vettore operator*(double Fact, const Vettore& vec) {
00116   Vettore Resp(vec.NDim);
00117   for(int d=0;d<vec.NDim;d++){
00118     Resp.x[d] = vec.x[d]*Fact;
00119   }
00120   return Resp;
00121 }
00122 Vettore Vettore::operator/(const Vettore &u){
00123   assert(NDim == u.NDim);
00124   Vettore Resp(this->NDim);
00125   for(int d=0;d<this->NDim;d++){
00126     Resp.x[d] = this->x[d] / u.x[d];
00127   }
00128   return Resp;
00129 }
00130 Vettore& Vettore::operator/=(const Vettore &u){
00131   for(int d=0;d<this->NDim;d++){
00132     this->x[d] /= u.x[d];
00133   }
00134   return *this;
00135 }
00136 double Vettore::operator%(const Vettore &u){
00137   assert(NDim == u.NDim);
00138   double Resp = 0.;
00139   for(int d=0;d<this->NDim;d++){
00140     Resp += this->x[d] * u.x[d];
00141   }
00142   return Resp;
00143 }
00144 Vettore Vettore::operator=(const Vettore &u){
00145   Vettore Resp(this->NDim);
00146   for(int d=0;d<this->NDim;d++){
00147     Resp.x[d] = u.x[d];
00148   }
00149   return Resp;
00150 }
00151 Vettore Vettore::operator^(const Vettore& u){
00152   assert(NDim == u.NDim);
00153   Vettore Resp(NDim);
00154   for(int d=0;d<NDim;d++){
00155     int NUno = (d+1)%NDim;
00156     int NDue = (d+2)%NDim;
00157     Resp.x[d] = u.x[NUno] * x[NDue] - u.x[NDue]*x[NUno];
00158   }
00159   return Resp;
00160 }
00161 Vettore& Vettore::operator^=(const Vettore& u){
00162   for(int d=0;d<NDim;d++){
00163     int NUno = (d+1)%NDim;
00164     int NDue = (d+2)%NDim;
00165     this->x[d] = this->x[NUno] * u.x[NDue] - this->x[NDue]*u.x[NUno];
00166   }
00167   return *this;
00168 }
00169 void Vettore::Print(){
00170   for(int d=0;d<NDim;d++)
00171     printf("%d) %lf\n",d,x[d]);
00172 }
00173 double Vettore::Abs(){
00174   double Resp = 0.;
00175   for(int d=0;d<NDim;d++)
00176     Resp += x[d];
00177   return ABS(Resp);
00178 }
00179 double Vettore::Norm(){
00180   double Resp=0.;
00181   for(int d=0;d<NDim;d++)
00182     Resp += QUAD((x[d]));
00183   return sqrt(Resp);
00184 }
00185 double Vettore::Normalize(){
00186   double Div = Norm();
00187   if(Div > 0.0)
00188     for(int d=0;d<NDim;d++)
00189       x[d] /= Div;
00190   return Div;
00191 }
00192 void Vettore::Subs(const Vettore *u,const Vettore *v){
00193   for(int d=0;d<NDim;d++)
00194     x[d] = u->x[d] - v->x[d];
00195 }
00196 void Vettore::Mult(double Fact){
00197   for(int d=0;d<NDim;d++)
00198     x[d] = Fact*x[d];
00199 }
00200 double Vettore::ScalS(const Vettore *u,const Vettore *v){
00201 #ifdef VECT_DEBUG
00202   if(NDim != u->NDim || NDim != v->NDim){
00203     printf("Incompatible vectors. Dim: %d %d\n",NDim,u->NDim); 
00204     return 0.;
00205   }
00206 #endif
00207   double Resp=0.;
00208   for(int d=0;d<NDim;d++)
00209     Resp += u->x[d] * v->x[d];
00210   return Resp;
00211 }
00212 double Vettore::Col(int N){
00213 #ifdef VECT_DEBUG
00214   if( N >= NDim || N < 0) return 0.;
00215 #endif
00216   return x[N];
00217 }
00218 void Vettore::Set(double Val,int N){
00219 #ifdef VECT_DEBUG
00220   if( N >= NDim || N < 0) return 0.;
00221 #endif
00222   x[N] = Val;
00223 }
00224 double Vettore::CosAngle(Vettore *u,Vettore *v){
00225   double Resp = ScalS(u,v);
00226   Resp /= v->Norm()*u->Norm();
00227   return Resp;
00228 }
00229 double Vettore::CosAngle(Vettore *u){
00230 #ifdef VECT_DEBUG
00231 #endif
00232   double Resp = 0.;
00233   for(int d=0;d<NDim;d++)
00234     Resp += x[d] * u->x[d];
00235   Resp /= Norm();
00236   Resp /= u->Norm();
00237   return Resp;
00238 }
00239 double Vettore::SinAngle(Vettore *u,Vettore *v){
00240 #ifdef VECT_DEBUG
00241 #endif
00242   Vettore w(u->NDim);
00243   w.VetV(u,v);
00244   double Resp = w.Norm()/(u->Norm()*v->Norm());
00245   return Resp;
00246 }
00247 double Vettore::SinAngle(Vettore *u){
00248 #ifdef VECT_DEBUG
00249 #endif
00250   double Resp = 0.;
00251   for(int d=0;d<NDim;d++){
00252     int NUno = (d+1)%NDim;
00253     int NDue = (d+2)%NDim;
00254     Resp += SQR(x[NUno] * u->x[NDue] - x[NDue]*u->x[NUno]);
00255   }
00256   Resp = sqrt(Resp)/(Norm()*u->Norm());
00257   return Resp;
00258 }
00259 double Vettore::Angle(Vettore *u,Vettore *v){
00260   return acos(CosAngle(u,v));
00261 }
00262 double Vettore::Angle(Vettore *u){
00263   return acos(CosAngle(u));
00264 }
00265 void Vettore::Axis(Vettore *u,Vettore *v){
00266 #ifdef VECT_DEBUG
00267   if(NDim != u->NDim || NDim != v->NDim){
00268     printf("Incompatible vectors. Dim: %d %d\n",NDim,u->NDim); 
00269     return ;
00270   }
00271 #endif
00272   for(int d=0;d<NDim;d++) x[d] = .5*(u->x[d] + v->x[d]);
00273 }
00274 void Vettore::Normal(const Vettore *u,const Vettore *v){
00275 #ifdef VECT_DEBUG
00276   if(v->NDim != u->NDim){
00277     printf("Incompatible vectors. Dim: %d %d\n",u->NDim,v->NDim); 
00278     return ;
00279   }
00280 #endif
00281   VetV(u,v);
00282   Normalize();
00283 }
00284 void Vettore::NormalSurf(const Vettore *u,const Vettore *v,const Vettore *w){
00285 #ifdef VECT_DEBUG
00286   if(v->NDim != u->NDim){
00287     printf("Incompatible vectors. Dim: %d %d\n",u->NDim,v->NDim); 
00288     return ;
00289   }
00290 #endif
00291   for(int d=0;d<NDim;d++){
00292     int NUno = (d+1)%NDim;
00293     int NDue = (d+2)%NDim;
00294     double dUno = (u->x[NUno] - w->x[NUno])*(v->x[NDue] - w->x[NDue]);
00295     double dDue = (u->x[NDue] - w->x[NDue])*(v->x[NUno] - w->x[NUno]);
00296     x[d] = dUno - dDue;
00297     //printf("%d -(%d %d)/%d   %lf\n",d,NUno,NDue,NDim,x[d]);
00298   }
00299 }
00300 void Vettore::ScalV(const Vettore *u,const Vettore *v){
00301 #ifdef VECT_DEBUG
00302   if(NDim != u->NDim || NDim != v->NDim){
00303     printf("Incompatible vectors. Dim: %d %d\n",NDim,u->NDim); 
00304     return ;
00305   }
00306 #endif
00307   for(int d=0;d<NDim;d++)
00308     x[d] = u->x[d] * v->x[d];
00309 }
00310 double Vettore::VetV(const Vettore *u,const Vettore *v){
00311   assert(NDim == u->NDim);
00312   double Area = 0.;
00313   for(int d=0;d<NDim;d++){
00314     int NUno = (d+1)%NDim;
00315     int NDue = (d+2)%NDim;
00316     x[d] = u->x[NUno] * v->x[NDue] - u->x[NDue]*v->x[NUno];
00317     Area += x[d];
00318   }
00319   return ABS(Area);
00320 }
00321 double Vettore::VetV(const Vettore *u){
00322   assert(NDim == u->NDim);
00323   double Area = 0.;
00324   Vettore w(NDim);
00325   for(int d=0;d<NDim;d++){
00326     int NUno = (d+1)%NDim;
00327     int NDue = (d+2)%NDim;
00328     w.x[d] = x[NUno] * u->x[NDue] - x[NDue]*u->x[NUno];
00329     Area += w.x[d];
00330   }
00331   for(int d=0;d<NDim;d++){
00332     x[d] = w.x[d];
00333   }
00334   return ABS(Area);
00335 }
00336 double Vettore::VetV3(const Vettore *u,const Vettore *v){
00337   double Area = 0.;
00338   x[0] = u->x[1]*v->x[2] - u->x[2]*v->x[1];
00339   x[1] = u->x[2]*v->x[0] - u->x[0]*v->x[2];
00340   x[2] = u->x[0]*v->x[1] - u->x[1]*v->x[0];
00341   for(int d=0;d<3;d++){
00342     Area += x[d];
00343   }
00344   return ABS(Area);
00345 }
00346 void Vettore::Rescale(double Length){
00347   double Fact = Length/Norm();
00348   for(int d=0;d<NDim;d++)
00349     x[d] *= Fact;
00350 }
00351 double Vettore::ProjOnAxis(Vettore *Axis){
00352   double Pre = 0.;
00353   double Norma = 0.;
00354   for(int d=0;d<NDim;d++){
00355     Pre += x[d]*Axis->x[d];
00356     Norma += SQR(Axis->x[d]);
00357   }
00358   double Length = 0.;
00359   for(int d=0;d<NDim;d++)
00360     Length += x[d] = Axis->x[d]*Pre/Norma;
00361   return Length;
00362 }
00363 double Vettore::ProjOnAxis(Vettore *Pos,Vettore *Axis){
00364   double Cos = CosAngle(Pos,Axis);
00365   double InvNorma = 1./Axis->Norm();
00366   return Cos*InvNorma;
00367 }
00368 void Vettore::ApplyOn(Vettore *o){
00369   for(int d=0;d<NDim;d++)
00370     x[d] = o->x[d] - x[d];
00371 }
00372 void Vettore::Copy(Vettore *c){
00373   for(int d=0;d<NDim;d++)
00374     x[d] = c->x[d];
00375 }
00376 void Vettore::Export(double *xx){
00377   for(int d=0;d<NDim;d++)
00378     xx[d] = x[d];
00379 }
00380 void Vettore::PerpTo(Vettore *a){
00381   double Sin = SinAngle(a);
00382   double Norma = Norm();
00383   Vettore w(NDim);
00384   for(int d=0;d<NDim;d++){
00385     int NUno = (d+1)%NDim;
00386     int NDue = (d+2)%NDim;
00387     w.x[d] = x[NUno]*a->x[NDue] - x[NDue]*a->x[NUno];
00388   }
00389   VetV(&w,a);
00390   Normalize();
00391   Rescale(Sin*Norma);
00392 }
00393 double Vettore::PerpTo(Vettore *Pos,Vettore *Axis){
00394   Vettore Perp1(Axis->NDim);
00395   Vettore Perp2(Axis->NDim);
00396   Perp1.VetV(Pos,Axis);
00397   Perp2.VetV(&Perp1,Axis);
00398   double Distance = Perp1.Norm()/Axis->Norm();
00399   double NormaInv = 1./Perp2.Norm();
00400   for(int d=0;d<Axis->NDim;d++)
00401     x[d] = Perp2[d]*Distance*NormaInv;
00402   return Distance;
00403   // double Sin = SinAngle(Axis,Pos);
00404   // double Norma = Norm();
00405   // Vettore w(NDim);
00406   // for(int d=0;d<NDim;d++){
00407   //   int NUno = (d+1)%NDim;
00408   //   int NDue = (d+2)%NDim;
00409   //   w.x[d] = Axis->x[NUno] * a.x[NDue] - x[NDue]*a->x[NUno];
00410   // }
00411   // VetV(w,a);
00412   // Normalize();
00413   // Rescale(Sin*Norma);
00414 }
00415 double Vettore::PerpTo3(Vettore *Pos,Vettore *Axis){
00416   Vettore Perp1(3);
00417   Vettore Perp2(3);
00418   Perp1.VetV3(Pos,Axis);
00419   Perp2.VetV3(&Perp1,Axis);
00420   double Distance = Perp1.Norm()/Axis->Norm();
00421   double NormaInv = 1./Perp2.Norm();
00422   for(int d=0;d<3;d++)
00423     x[d] = Perp2[d]*Distance*NormaInv;
00424   return Distance;
00425 }
00426 double Vettore::ProjOnSurf(Vettore *S1,Vettore *S2,Vettore *S3,Vettore *P){
00427   double Known[3];
00428   double UnKnown[3];
00429   Vettore Normal(3);
00430   Normal.NormalSurf(S1,S2,S3);
00431   Normal.Normalize();
00432   Matrice Mat(3,3);
00433   for(int d=0;d<3;d++){
00434     Known[d] = S2->Val(d) + P->Val(d);
00435     Mat.Set(0,d,S1->Val(d)-S2->Val(d));
00436     Mat.Set(1,d,S2->Val(d)-S3->Val(d));
00437     Mat.Set(2,d,Normal.Val(d));
00438   }
00439   Mat.Solve(Known,UnKnown);
00440   //double Norma = 0.;
00441   for(int d=0;d<3;d++){
00442     //Norma += SQR(UnKnown[d]);
00443     x[d] = UnKnown[d];
00444   }
00445   return Norm();
00446 }