Allink
v0.1
|
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 }