00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 #ifndef _NO_LIBRPP_
00042 
00043 #include <cstdlib>
00044 #include <cstdio>
00045 #include "rpp_vecmat.h"
00046 #include "math.h"
00047 #include "assert.h"
00048 
00049 
00050 namespace rpp {
00051 
00052 
00053 int svdcmp( double **a, int m,int n, double *w, double **v);
00054 int quintic(double [], double [], double [], int*, double);
00055 int quartic(double[], double[], double[], int* );
00056 int cubic(double[], double[], int*);
00057 
00058 
00059 
00060 #ifdef _WIN32_WCE
00061         real_t _sin(real_t a) { return(real_t(::sin(a))); }
00062         real_t _cos(real_t a) { return(real_t(::cos(a))); }
00063         real_t _atan2(real_t a, real_t b) { return(real_t(::atan2(a,b))); }
00064         real_t _abs(real_t a) { return((a>0?a:-a)); }
00065         real_t _acos(real_t a) { return(real_t(::acos(a))); }
00066         real_t _sqrt(real_t a) { return(real_t(::sqrt(a))); }
00067         real_t _pow(real_t a, real_t b) { return(real_t(::pow(a,b))); }
00068 #else
00069         real_t _sin(real_t a) { return(::sin(a)); }
00070         real_t _cos(real_t a) { return(::cos(a)); }
00071         real_t _atan2(real_t a, real_t b) { return(::atan2(a,b)); }
00072         real_t _abs(real_t a) { return((a>0?a:-a)); }
00073         real_t _acos(real_t a) { return(::acos(a)); }
00074         real_t _sqrt(real_t a) { return(::sqrt(a)); }
00075         real_t _pow(real_t a, real_t b) { return(::pow(a,b)); }
00076         
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 #endif
00086 
00087 
00088 
00089 void mat33_from_double_pptr(mat33_t &mat, double** m_ptr)
00090 {
00091         for(int m=0; m<3; m++)
00092                 for(int n=0; n<3; n++)
00093                         mat.m[m][n] = (real_t) m_ptr[m][n];
00094 }
00095 
00096 
00097 void mat33_from_float_pptr(mat33_t &mat, float** m_ptr)
00098 {
00099         for(int m=0; m<3; m++)
00100                 for(int n=0; n<3; n++)
00101                         mat.m[m][n] = (real_t) m_ptr[m][n];
00102 }
00103 
00104 
00105 double ** mat33_to_double_pptr(const mat33_t &mat)
00106 {
00107         double **M = (double**) malloc(3*sizeof(double*));
00108         for(int i=0; i<3; i++) M[i] = (double*) malloc(3*sizeof(double));
00109         for(int m=0; m<3; m++)
00110                 for(int n=0; n<3; n++)
00111                         M[m][n] = (double) mat.m[m][n];
00112         return(M);
00113 }
00114 
00115 
00116 float ** mat33_to_float_pptr(const mat33_t &mat)
00117 {
00118         float **M = (float**) malloc(3*sizeof(float*));
00119         for(int i=0; i<3; i++) M[i] = (float*) malloc(3*sizeof(float));
00120         for(int m=0; m<3; m++)
00121                 for(int n=0; n<3; n++)
00122                         M[m][n] = (float) mat.m[m][n];
00123         return(M);
00124 }
00125 
00126 
00127 void free_double_pptr(double*** m_ptr)
00128 {
00129         for(int i=0; i<3; i++) free((*m_ptr)[i]);
00130         free(*m_ptr);
00131 }
00132 
00133 void free_float_pptr(float*** m_ptr)
00134 {
00135         for(int i=0; i<3; i++) free((*m_ptr)[i]);
00136         free(*m_ptr);
00137 }
00138 
00139 void vec3_from_double_ptr(vec3_t &vec, double* v_ptr)
00140 {
00141         vec.v[0] = (real_t)v_ptr[0];
00142         vec.v[1] = (real_t)v_ptr[1];
00143         vec.v[2] = (real_t)v_ptr[2];
00144 }
00145 
00146 void vec3_from_float_ptr(vec3_t &vec, float* v_ptr)
00147 {
00148         vec.v[0] = (real_t)v_ptr[0];
00149         vec.v[1] = (real_t)v_ptr[1];
00150         vec.v[2] = (real_t)v_ptr[2];
00151 }
00152 
00153 double* vec3_to_double_ptr(const vec3_t &vec)
00154 {
00155         double* v = (double*) malloc(3* sizeof(double));
00156         v[0] = (double) vec.v[0];
00157         v[1] = (double) vec.v[1];
00158         v[2] = (double) vec.v[2];
00159         return(v);
00160 }
00161 
00162 float* vec3_to_float_ptr(const vec3_t &vec)
00163 {
00164         float* v = (float*) malloc(3* sizeof(float));
00165         v[0] = (float) vec.v[0];
00166         v[1] = (float) vec.v[1];
00167         v[2] = (float) vec.v[2];
00168         return(v);
00169 }
00170 
00171 
00172 void free_double_ptr(double** v_ptr)
00173 {
00174         free(*v_ptr);
00175 }
00176 
00177 void free_float_ptr(float** v_ptr)
00178 {
00179         free(*v_ptr);
00180 }
00181 
00182 
00183 
00184 void mat33_assign(mat33_t &m,
00185                                   const real_t m00, const real_t m01, const real_t m02,
00186                                   const real_t m10, const real_t m11, const real_t m12,
00187                                   const real_t m20, const real_t m21, const real_t m22)
00188 {
00189         m.m[0][0] = m00;        m.m[0][1] = m01;        m.m[0][2] = m02;
00190         m.m[1][0] = m10;        m.m[1][1] = m11;        m.m[1][2] = m12;
00191         m.m[2][0] = m20;        m.m[2][1] = m21;        m.m[2][2] = m22;
00192 }
00193 
00194 
00195 void _dbg_quat_print(const quat_t &q, char* name)
00196 {
00197         printf("%s:  s = [ %.4f ]  v = [ ",name,q.s);
00198         for(unsigned int c=0; c<3; c++)
00199         {
00200                 
00201                 printf("%.4f ",q.v.v[c]);
00202         }
00203         printf("]\n");
00204 }
00205 
00206 void _dbg_mat33_print(const mat33_t &m, char* name)
00207 {
00208         printf("%s:\n",name);
00209         for(unsigned int r=0; r<3; r++)
00210         {
00211                 printf("[ ");
00212                 for(unsigned int c=0; c<3; c++)
00213                 {
00214                         double d = (double)(m.m[r][c]);
00215                         printf("%.4f ",d);
00216                 }
00217                 printf("]\n");
00218         }
00219 }
00220 
00221 void _dbg_mat33_array_print(const mat33_array &m, char* name)
00222 {
00223         for(unsigned int i=0; i<m.size(); i++)
00224         {
00225                 printf("%s.at(%i):\n",name,i);
00226                 for(unsigned int r=0; r<3; r++)
00227                 {
00228                         printf("[ ");
00229                         for(unsigned int c=0; c<3; c++)
00230                         {
00231                                 double d = (double)(m.at(i).m[r][c]);
00232                                 printf("%.4f ",d);
00233                         }
00234                         printf("]\n");
00235                 }
00236         }
00237 }
00238 
00239 void _dbg_vec3_print(const vec3_t &v, char* name)
00240 {
00241         printf("%s:  [ ",name);
00242         for(unsigned int c=0; c<3; c++)
00243         {
00244                 double d = (double)(v.v[c]);
00245                 printf("%.4f ",d);
00246         }
00247         printf("]\n");
00248 }
00249 
00250 void _dbg_vec3_array_print(const vec3_array &v, char* name)
00251 {
00252         for(unsigned int i=0; i<v.size(); i++)
00253         {
00254                 printf("%s.at(%i):  [ ",name,i);
00255                 for(unsigned int c=0; c<3; c++)
00256                 {
00257                         double d = (double)(v.at(i).v[c]);
00258                         printf("%.4f ",d);
00259                 }
00260                 printf("]\n");
00261         }
00262 }
00263 
00264 
00265 bool _dbg_load_vec3_array(vec3_array &va, char* filename)
00266 {
00267         FILE *fp = fopen( filename, "r" );
00268         if( fp == NULL ) return(false);
00269 
00270         int n;
00271         int lineno = 0;
00272         va.clear();
00273 
00274         while(!feof(fp))
00275         {
00276                 ++lineno;
00277                 double vx,vy,vz;
00278                 vec3_t v;
00279                 n = fscanf(fp, "%lf%lf%lf\n", &vx,&vy,&vz);
00280                 if((n!=3) || ferror(fp))
00281                 {
00282                         printf("file i/o error: %s (line %i)",filename,lineno);
00283                         fclose(fp);
00284                         return(lineno > 1);
00285                 }
00286                 v.v[0] = (real_t)vx;
00287                 v.v[1] = (real_t)vy;
00288                 v.v[2] = (real_t)vz;
00289                 va.push_back(v);
00290         }
00291 
00292         fclose(fp);
00293         return(true);
00294 }
00295 
00296 
00297 void vec3_assign(vec3_t &v, const real_t x, const real_t y, const real_t z)
00298 {
00299         v.v[0] = x;
00300         v.v[1] = y;
00301         v.v[2] = z;
00302 }
00303 
00304 void vec3_clear(vec3_t &v)
00305 {
00306         v.v[0] = 0;
00307         v.v[1] = 0;
00308         v.v[2] = 0;
00309 }
00310 
00311 void vec3_copy(vec3_t &a, const vec3_t &b)
00312 {
00313         a.v[0] = b.v[0];
00314         a.v[1] = b.v[1];
00315         a.v[2] = b.v[2];
00316 }
00317 
00318 
00319 void vec3_array_sum(vec3_t &v_sum2, const vec3_array &va)
00320 {
00321         vec3_clear(v_sum2);
00322         for(vec3_array_const_iter iter = va.begin();
00323                 iter != va.end(); iter++)
00324         {
00325                 v_sum2.v[0] += (*iter).v[0];
00326                 v_sum2.v[1] += (*iter).v[1];
00327                 v_sum2.v[2] += (*iter).v[2];
00328         }
00329 }
00330 
00331 void vec3_array_sum(scalar_array &v_sum1, const vec3_array &va)
00332 {
00333         v_sum1.clear();
00334         v_sum1.resize(va.size());
00335 
00336         for(unsigned int i=0; i<va.size(); i++)
00337                 v_sum1.at(i) = (va[i].v[0] + va[i].v[1] + va[i].v[2]);
00338 }
00339 
00340 void vec3_array_pow2(vec3_array &va)
00341 {
00342         for(vec3_array_iter iter = va.begin();
00343                 iter != va.end(); iter++)
00344         {
00345                 (*iter).v[0] *= (*iter).v[0];
00346                 (*iter).v[1] *= (*iter).v[1];
00347                 (*iter).v[2] *= (*iter).v[2];
00348         }
00349 }
00350 
00351 
00352 
00353 
00354 void vec3_div(vec3_t &va, const real_t n)
00355 {
00356         va.v[0] /= n;
00357         va.v[1] /= n;
00358         va.v[2] /= n;
00359 }
00360 
00361 void vec3_div(vec3_t &va, const vec3_t &vb)
00362 {
00363         va.v[0] /= vb.v[0];
00364         va.v[1] /= vb.v[1];
00365         va.v[2] /= vb.v[2];
00366 }
00367 
00368 void vec3_mult(vec3_t &va, const real_t n)
00369 {
00370         va.v[0] *= n;
00371         va.v[1] *= n;
00372         va.v[2] *= n;
00373 }
00374 
00375 void vec3_mult(vec3_t &va, const vec3_t &vb)
00376 {
00377         va.v[0] *= vb.v[0];
00378         va.v[1] *= vb.v[1];
00379         va.v[2] *= vb.v[2];
00380 }
00381 
00382 void vec3_add(vec3_t &va, const real_t f)
00383 {
00384         va.v[0] += f;
00385         va.v[1] += f;
00386         va.v[2] += f;
00387 }
00388 
00389 void vec3_add(vec3_t &va, const vec3_t &vb)
00390 {
00391         va.v[0] += vb.v[0];
00392         va.v[1] += vb.v[1];
00393         va.v[2] += vb.v[2];
00394 }
00395 
00396 void vec3_add(vec3_t &va, const vec3_t &vb, const vec3_t &vc)
00397 {
00398         va.v[0] = vb.v[0] + vc.v[0];
00399         va.v[1] = vb.v[1] + vc.v[1];
00400         va.v[2] = vb.v[2] + vc.v[2];
00401 }
00402 
00403 void vec3_sub(vec3_t &va, const real_t f)
00404 {
00405         va.v[0] -= f;
00406         va.v[1] -= f;
00407         va.v[2] -= f;
00408 }
00409 
00410 void vec3_sub(vec3_t &va, const vec3_t &vb)
00411 {
00412         va.v[0] -= vb.v[0];
00413         va.v[1] -= vb.v[1];
00414         va.v[2] -= vb.v[2];
00415 }
00416 
00417 void vec3_sub(vec3_t &va, const vec3_t &vb, const vec3_t &vc)
00418 {
00419         va.v[0] = vb.v[0] - vc.v[0];
00420         va.v[1] = vb.v[1] - vc.v[1];
00421         va.v[2] = vb.v[2] - vc.v[2];
00422 }
00423 
00424 real_t vec3_dot(const vec3_t &va, const vec3_t &vb)
00425 {
00426         return(va.v[0]*vb.v[0]+va.v[1]*vb.v[1]+va.v[2]*vb.v[2]);
00427 }
00428 
00429 void vec3_cross(vec3_t &va, const vec3_t &vb, const vec3_t &vc)
00430 {
00431         va.v[0] = (vb.v[1] * vc.v[2] - vc.v[1] * vb.v[2]);
00432         va.v[1] = (vb.v[2] * vc.v[0] - vc.v[2] * vb.v[0]);
00433         va.v[2] = (vb.v[0] * vc.v[1] - vc.v[0] * vb.v[1]);
00434 }
00435 
00436 real_t vec3_norm(const vec3_t &v)
00437 {
00438         return(_sqrt(v.v[0]*v.v[0] + v.v[1]*v.v[1] + v.v[2]*v.v[2]));
00439 }
00440 
00441 real_t vec3_sum(const vec3_t &v)
00442 {
00443         return(v.v[0] + v.v[1] + v.v[2]);
00444 }
00445 
00446 void vec3_array_add(vec3_array &va, const vec3_t &a)
00447 {
00448         for(vec3_array_iter iter = va.begin();
00449                 iter != va.end(); iter++)
00450         {
00451                 (*iter).v[0] += a.v[0];
00452                 (*iter).v[1] += a.v[1];
00453                 (*iter).v[2] += a.v[2];
00454         }
00455 }
00456 
00457 void vec3_array_sub(vec3_array &va, const vec3_t &a) 
00458 {
00459         for(vec3_array_iter iter = va.begin();
00460                 iter != va.end(); iter++)
00461         {
00462                 (*iter).v[0] -= a.v[0];
00463                 (*iter).v[1] -= a.v[1];
00464                 (*iter).v[2] -= a.v[2];
00465         }
00466 }
00467 
00468 void vec3_array_set(vec3_array &va, const vec3_t &a, const bool mask[3])
00469 {
00470         for(vec3_array_iter iter = va.begin();
00471                 iter != va.end(); iter++)
00472         {
00473                 if(mask[0]) (*iter).v[0] = a.v[0];
00474                 if(mask[1]) (*iter).v[1] = a.v[1];
00475                 if(mask[2]) (*iter).v[2] = a.v[2];
00476         }
00477 }
00478 
00479 void vec3_array_mult(vec3_array &va, const scalar_array &c)
00480 {
00481         assert(va.size() == c.size());
00482         for(unsigned int i=0; i<va.size(); i++)
00483         {
00484                 va[i].v[0] *= c[i];
00485                 va[i].v[1] *= c[i];
00486                 va[i].v[2] *= c[i];
00487         }
00488 }
00489 
00490 void vec3_array_mean(vec3_t &v_mean, const vec3_array &va)
00491 {
00492         vec3_array_sum(v_mean, va);
00493         real_t l = (real_t) va.size();
00494         vec3_div(v_mean, l);
00495 }
00496 
00497 
00498 void vec3_mul_vec3trans(mat33_t &m, const vec3_t &va, const vec3_t &vb)
00499 {
00500         m.m[0][0] = va.v[0] * vb.v[0];
00501         m.m[0][1] = va.v[0] * vb.v[1];
00502         m.m[0][2] = va.v[0] * vb.v[2];
00503         m.m[1][0] = va.v[1] * vb.v[0];
00504         m.m[1][1] = va.v[1] * vb.v[1];
00505         m.m[1][2] = va.v[1] * vb.v[2];
00506         m.m[2][0] = va.v[2] * vb.v[0];
00507         m.m[2][1] = va.v[2] * vb.v[1];
00508         m.m[2][2] = va.v[2] * vb.v[2];
00509 }
00510 
00511 real_t vec3trans_mul_vec3(const vec3_t &va, const vec3_t &vb)
00512 {
00513         return(va.v[0] * vb.v[0] + va.v[1] * vb.v[1] + va.v[2] * vb.v[2]);
00514 }
00515 
00516 
00517 void mat33_clear(mat33_t &m)
00518 {
00519         for(unsigned int r=0; r<3; r++)
00520                 for(unsigned int c=0; c<3; c++)
00521                 {
00522                         m.m[r][c] = 0;
00523                 }
00524 }
00525 
00526 void mat33_copy(mat33_t &md, const mat33_t &ms)
00527 {
00528         for(unsigned int r=0; r<3; r++)
00529                 for(unsigned int c=0; c<3; c++)
00530                 {
00531                         md.m[r][c] = ms.m[r][c];
00532                 }
00533 }
00534 
00535 
00536 void mat33_to_col_vec3(vec3_t &c0, vec3_t &c1, vec3_t &c2, const mat33_t &m)
00537 {
00538         for(unsigned int r=0; r<3; r++)
00539         {
00540                 c0.v[r] = m.m[r][0];
00541                 c1.v[r] = m.m[r][1];
00542                 c2.v[r] = m.m[r][2];
00543         }
00544 }
00545 
00546 
00547 void mat33_div(mat33_t &m, const real_t f)
00548 {
00549         m.m[0][0] /= f;
00550         m.m[0][1] /= f;
00551         m.m[0][2] /= f;
00552         m.m[1][0] /= f;
00553         m.m[1][1] /= f;
00554         m.m[1][2] /= f;
00555         m.m[2][0] /= f;
00556         m.m[2][1] /= f;
00557         m.m[2][2] /= f;
00558 }
00559 
00560 void mat33_eye(mat33_t &m)
00561 {
00562         m.m[0][0] = 1;
00563         m.m[0][1] = 0;
00564         m.m[0][2] = 0;
00565         m.m[1][0] = 0;
00566         m.m[1][1] = 1;
00567         m.m[1][2] = 0;
00568         m.m[2][0] = 0;
00569         m.m[2][1] = 0;
00570         m.m[2][2] = 1;
00571 }
00572 
00573 real_t mat33_sum(const mat33_t &m)
00574 {
00575         real_t sum(0.0f);
00576         for(unsigned int r=0; r<3; r++)
00577                 for(unsigned int c=0; c<3; c++)
00578                 {
00579                         sum += m.m[r][c];
00580                 }
00581                 return(sum);
00582 }
00583 
00584 
00585 bool mat33_all_zeros(const mat33_t &m)
00586 {
00587         for(unsigned int r=0; r<3; r++)
00588                 for(unsigned int c=0; c<3; c++)
00589                 {
00590                         if(m.m[r][c] != 0) return(false);
00591                 }
00592                 return(true);
00593 }
00594 
00595 void mat33_set_all_zeros(mat33_t &m)
00596 {
00597         for(unsigned int r=0; r<3; r++)
00598                 for(unsigned int c=0; c<3; c++)
00599                 {
00600                         m.m[r][c] = 0;
00601                 }
00602 }
00603 
00604 
00605 void mat33_array_sum(mat33_t &s, const mat33_array &ma)
00606 {
00607         mat33_clear(s);
00608         for(mat33_array_const_iter iter = ma.begin();
00609                 iter != ma.end(); iter++)
00610         {
00611                 for(unsigned int c=0; c<3; c++)
00612                 {
00613                         s.m[0][c] += (*iter).m[0][c];
00614                         s.m[1][c] += (*iter).m[1][c];
00615                         s.m[2][c] += (*iter).m[2][c];
00616                 }
00617         }
00618 }
00619 
00620 
00621 void mat33_sub(mat33_t &mr, const mat33_t &ma, const mat33_t &mb)
00622 {
00623         for(unsigned int r=0; r<3; r++)
00624                 for(unsigned int c=0; c<3; c++)
00625                 {
00626                         mr.m[r][c] = ma.m[r][c]-mb.m[r][c];
00627                 }
00628 }
00629 
00630 void mat33_sub(mat33_t &ma, const mat33_t &mb)
00631 {
00632         for(unsigned int r=0; r<3; r++)
00633                 for(unsigned int c=0; c<3; c++)
00634                 {
00635                         ma.m[r][c] -= mb.m[r][c];
00636                 }
00637 }
00638 
00639 void mat33_add(mat33_t &mr, const mat33_t &ma, const mat33_t &mb)
00640 {
00641         for(unsigned int r=0; r<3; r++)
00642                 for(unsigned int c=0; c<3; c++)
00643                 {
00644                         mr.m[r][c] = ma.m[r][c]+mb.m[r][c];
00645                 }
00646 }
00647 
00648 void mat33_add(mat33_t &ma, const mat33_t &mb)
00649 {
00650         for(unsigned int r=0; r<3; r++)
00651                 for(unsigned int c=0; c<3; c++)
00652                 {
00653                         ma.m[r][c] += mb.m[r][c];
00654                 }
00655 }
00656 
00657 
00658 real_t mat33_det(const mat33_t &a)
00659 {
00660         real_t determinant = a.m[0][0]*a.m[1][1]*a.m[2][2] + a.m[0][1]*a.m[1][2]*a.m[2][0] +
00661                 a.m[0][2]*a.m[1][0]*a.m[2][1] - a.m[2][0]*a.m[1][1]*a.m[0][2] - 
00662                 a.m[2][1]*a.m[1][2]*a.m[0][0] - a.m[2][2]*a.m[1][0]*a.m[0][1];
00663         return(determinant);
00664 }
00665 
00666 void mat33_inv(mat33_t &mi, const mat33_t &ma)
00667 {
00668         real_t determinant = mat33_det(ma);
00669         mi.m[0][0] = (ma.m[1][1]*ma.m[2][2] - ma.m[1][2]*ma.m[2][1])/determinant;
00670         mi.m[0][1] = (ma.m[0][2]*ma.m[2][1] - ma.m[0][1]*ma.m[2][2])/determinant;
00671         mi.m[0][2] = (ma.m[0][1]*ma.m[1][2] - ma.m[0][2]*ma.m[1][1])/determinant;
00672 
00673         mi.m[1][0] = (ma.m[1][2]*ma.m[2][0] - ma.m[1][0]*ma.m[2][2])/determinant;
00674         mi.m[1][1] = (ma.m[0][0]*ma.m[2][2] - ma.m[0][2]*ma.m[2][0])/determinant;
00675         mi.m[1][2] = (ma.m[0][2]*ma.m[1][0] - ma.m[0][0]*ma.m[1][2])/determinant;
00676 
00677         mi.m[2][0] = (ma.m[1][0]*ma.m[2][1] - ma.m[1][1]*ma.m[2][0])/determinant;
00678         mi.m[2][1] = (ma.m[0][1]*ma.m[2][0] - ma.m[0][0]*ma.m[2][1])/determinant;
00679         mi.m[2][2] = (ma.m[0][0]*ma.m[1][1] - ma.m[0][1]*ma.m[1][0])/determinant;
00680 }
00681 
00682 void mat33_mult(mat33_t &m0, const mat33_t &m1, const mat33_t &m2)
00683 {
00684         m0.m[0][0] = m1.m[0][0]*m2.m[0][0] + m1.m[0][1]*m2.m[1][0] + m1.m[0][2]*m2.m[2][0];
00685         m0.m[0][1] = m1.m[0][0]*m2.m[0][1] + m1.m[0][1]*m2.m[1][1] + m1.m[0][2]*m2.m[2][1];
00686         m0.m[0][2] = m1.m[0][0]*m2.m[0][2] + m1.m[0][1]*m2.m[1][2] + m1.m[0][2]*m2.m[2][2];
00687         m0.m[1][0] = m1.m[1][0]*m2.m[0][0] + m1.m[1][1]*m2.m[1][0] + m1.m[1][2]*m2.m[2][0];
00688         m0.m[1][1] = m1.m[1][0]*m2.m[0][1] + m1.m[1][1]*m2.m[1][1] + m1.m[1][2]*m2.m[2][1];
00689         m0.m[1][2] = m1.m[1][0]*m2.m[0][2] + m1.m[1][1]*m2.m[1][2] + m1.m[1][2]*m2.m[2][2];
00690         m0.m[2][0] = m1.m[2][0]*m2.m[0][0] + m1.m[2][1]*m2.m[1][0] + m1.m[2][2]*m2.m[2][0];
00691         m0.m[2][1] = m1.m[2][0]*m2.m[0][1] + m1.m[2][1]*m2.m[1][1] + m1.m[2][2]*m2.m[2][1];
00692         m0.m[2][2] = m1.m[2][0]*m2.m[0][2] + m1.m[2][1]*m2.m[1][2] + m1.m[2][2]*m2.m[2][2];
00693 }
00694 
00695 void mat33_mult(mat33_t &mr, const real_t n)
00696 {
00697         for(unsigned int r=0; r<3; r++)
00698                 for(unsigned int c=0; c<3; c++)
00699                 {
00700                         mr.m[r][c] *= n;
00701                 }
00702 }
00703 
00704 void mat33_transpose(mat33_t &t, const mat33_t m)
00705 {
00706         for(unsigned int r=0; r<3; r++)
00707                 for(unsigned int c=0; c<3; c++)
00708                 {
00709                         t.m[r][c] = m.m[c][r];
00710                 }
00711 }
00712 
00713 void vec3_mult(vec3_t &v0, const mat33_t &m1, const vec3_t &v2)
00714 {
00715         v0.v[0] = m1.m[0][0]*v2.v[0] + m1.m[0][1]*v2.v[1] + m1.m[0][2]*v2.v[2];
00716         v0.v[1] = m1.m[1][0]*v2.v[0] + m1.m[1][1]*v2.v[1] + m1.m[1][2]*v2.v[2];
00717         v0.v[2] = m1.m[2][0]*v2.v[0] + m1.m[2][1]*v2.v[1] + m1.m[2][2]*v2.v[2];
00718 }
00719 
00720 void vec3_array_mult(vec3_array &va, const mat33_t &m, const vec3_array &vb)
00721 {
00722         va.clear();
00723         va.resize(vb.size());
00724         for(unsigned int i=0; i<vb.size(); i++)
00725         {
00726                 vec3_mult(va.at(i),m,vb.at(i));
00727         }
00728 }
00729 
00730 void mat33_svd2(mat33_t &u, mat33_t &s, mat33_t &v, const mat33_t &m)
00731 {
00732         mat33_clear(u);
00733         mat33_clear(v);
00734 
00735         double** m_ptr = mat33_to_double_pptr(m);
00736         double** v_ptr = mat33_to_double_pptr(v);
00737 
00738         vec3_t q;
00739         vec3_clear(q);
00740         double*  q_ptr = vec3_to_double_ptr(q);
00741 
00742          svdcmp(m_ptr, 3, 3, q_ptr, v_ptr);
00743 
00744         mat33_from_double_pptr(u,m_ptr);
00745         mat33_from_double_pptr(v,v_ptr);
00746         vec3_from_double_ptr(q,q_ptr);
00747 
00748         mat33_clear(s);
00749         s.m[0][0] = (real_t)q_ptr[0];
00750         s.m[1][1] = (real_t)q_ptr[1];
00751         s.m[2][2] = (real_t)q_ptr[2];
00752 
00753         free_double_pptr(&m_ptr);
00754         free_double_pptr(&v_ptr);
00755         free_double_ptr(&q_ptr);
00756 }
00757 
00758 void quat_mult(quat_t &q, const real_t s)
00759 {
00760         vec3_mult(q.v,s);
00761         q.s *= s;
00762 }
00763 
00764 real_t quat_norm(const quat_t &q)
00765 {
00766         const real_t f_vn = vec3_norm(q.v);
00767         return(_sqrt((f_vn*f_vn) + (q.s*q.s)));
00768 
00769 }
00770 
00771 void mat33_from_quat(mat33_t &m, const quat_t &q)
00772 {
00773         const real_t a = q.s;
00774         const real_t b = q.v.v[0];
00775         const real_t c = q.v.v[1];
00776         const real_t d = q.v.v[2];
00777 
00778         m.m[0][0] = (a*a)+(b*b)-(c*c)-(d*d);
00779         m.m[0][1] = real_t(2.0f)*(b*c-a*d);
00780         m.m[0][2] = real_t(2.0f)*(b*d+a*c);
00781 
00782         m.m[1][0] = real_t(2.0f)*(b*c+a*d);
00783         m.m[1][1] = (a*a)+(c*c)-(b*b)-(d*d);
00784         m.m[1][2] = real_t(2.0f)*(c*d-a*b);
00785 
00786         m.m[2][0] = real_t(2.0f)*(b*d-a*c);
00787         m.m[2][1] = real_t(2.0f)*(c*d+a*b);
00788         m.m[2][2] = (a*a)+(d*d)-(b*b)-(c*c);
00789 }
00790 
00791 
00792 void normRv(vec3_t &n, const vec3_t &v)
00793 {
00794         vec3_t _v1;
00795         vec3_copy(_v1,v);
00796         vec3_mult(_v1,_v1);
00797         real_t l = 1.0f / _sqrt(_v1.v[0] + _v1.v[1] + _v1.v[2]);
00798         vec3_copy(n,v);
00799         vec3_mult(n,l);
00800 }
00801 
00802 
00803 void normRv(vec3_array &normR_v, const vec3_array &v)
00804 {
00805         normR_v.assign(v.begin(),v.end());
00806         vec3_array_pow2(normR_v);
00807         scalar_array _l;
00808         vec3_array_sum(_l,normR_v);
00809 
00810         for(scalar_array::iterator iter = _l.begin();
00811                 iter != _l.end(); iter++)
00812         {
00813                 (*iter) = 1.0f / _sqrt(*iter);
00814         }
00815 
00816         normR_v.assign(v.begin(),v.end());
00817         vec3_array_mult(normR_v,_l);
00818 }
00819 
00820 
00821 int solve_polynomial(scalar_array &r_sol, const scalar_array &coefficients)
00822 {
00823         if(coefficients.size() != 5) return(0);
00824         r_sol.clear();
00825 
00826         double dd[5] = {(double)coefficients[0],
00827                 (double)coefficients[1],
00828                 (double)coefficients[2],
00829                 (double)coefficients[3],
00830                 (double)coefficients[4] };
00831 
00832         double sol[4] = {0,0,0,0};
00833         double soli[4] = {0,0,0,0};
00834         int n_sol = 0;
00835         quartic(dd, sol, soli, &n_sol);
00836 
00837         if(n_sol <= 0) return(0); 
00838 
00839         r_sol.resize(n_sol);
00840         for(int i=0; i<n_sol; i++) r_sol[i] = (real_t)sol[i];
00841         return(n_sol);
00842 }
00843 
00844 
00845 void scalar_array_pow(scalar_array &sa, const real_t f)
00846 {
00847         for(unsigned int i=0; i<sa.size(); i++) sa.at(i) = _pow(sa[i],f);
00848 }
00849 
00850 void scalar_array_negate(scalar_array &sa)
00851 {
00852         for(unsigned int i=0; i<sa.size(); i++) sa.at(i) = - sa.at(i);
00853 }
00854 
00855 void scalar_array_assign(scalar_array &sa,
00856                                                  const  real_t f,
00857                                                  const unsigned int sz)
00858 {
00859         sa.clear();
00860         sa.resize(sz);
00861         for(unsigned int i=0; i<sz; i++) sa.at(i) = f;
00862 }
00863 
00864 
00865 void scalar_array_add(scalar_array &sa, const scalar_array &sb)
00866 {
00867         assert(sa.size() == sb.size());
00868         for(unsigned int i=0; i<(unsigned int)sa.size(); i++)
00869                 sa.at(i) = sa.at(i) + sb.at(i);
00870 }
00871 
00872 void scalar_array_clear(scalar_array &sa)
00873 {
00874         for(unsigned int i=0; i<(unsigned int)sa.size(); i++) sa.at(i) = 0.;
00875 }
00876 
00877 void scalar_array_atan2(scalar_array &sa, 
00878                                                 const scalar_array &sb,
00879                                                 const scalar_array &sc)
00880 {
00881         assert(sb.size() == sc.size());
00882         sa.clear();
00883         sa.resize(sb.size());
00884         for(unsigned int i=0; i<(unsigned int)sb.size(); i++)
00885                 sa[i] = _atan2(sb[i],sc[i]);
00886 }
00887 
00888 void _dbg_scalar_array_print(const scalar_array &sa, char* name)
00889 {
00890         for(unsigned int i=0; i<sa.size(); i++)
00891                 printf("%s.at(%i):  [ %e ]\n",name,i,sa[i]);
00892 }
00893 
00894 void scalar_array_div(scalar_array &sa, real_t f)
00895 {
00896         for(unsigned int i=0; i<(unsigned int)sa.size(); i++)
00897         {
00898                 sa.at(i) /= f;
00899         }
00900 }
00901 
00902 void scalar_array_div(scalar_array &sa, const scalar_array &sb)
00903 {
00904         assert(sa.size() == sb.size());
00905         for(unsigned int i=0; i<(unsigned int)sa.size(); i++)
00906                 sa[i] /= sb[i];
00907 }
00908 
00909 void scalar_array_mult(scalar_array &sa, real_t f)
00910 {
00911         for(unsigned int i=0; i<(unsigned int)sa.size(); i++)
00912         {
00913                 sa.at(i) *= f;
00914         }
00915 }
00916 
00917 void scalar_array_add(scalar_array &sa, real_t f)
00918 {
00919         for(unsigned int i=0; i<(unsigned int)sa.size(); i++)
00920         {
00921                 sa.at(i) += f;
00922         }
00923 }
00924 
00925 void scalar_array_sub(scalar_array &sa, real_t f)
00926 {
00927         for(unsigned int i=0; i<(unsigned int)sa.size(); i++)
00928         {
00929                 sa.at(i) -= f;
00930         }
00931 }
00932 
00933 void mat33_pow2(mat33_t &m)
00934 {
00935         for(unsigned int r=0; r<3; r++)
00936                 for(unsigned int c=0; c<3; c++)
00937                 {
00938                         m.m[r][c] *= m.m[r][c];
00939                 }
00940 }
00941 
00942 
00943 void _dbg_vec3_fprint(void* fp, const vec3_t &v, char* name)
00944 {
00945         fprintf((FILE*)fp,"%s:  [ ",name);
00946         for(unsigned int c=0; c<3; c++)
00947         {
00948                 fprintf((FILE*)fp,"%.4f ",v.v[c]);
00949         }
00950         fprintf((FILE*)fp,"]\n");
00951 }
00952 
00953 void _dbg_mat33_fprint(void* fp, const mat33_t &m, char* name)
00954 {
00955         fprintf((FILE*)fp,"%s:\n",name);
00956         for(unsigned int r=0; r<3; r++)
00957         {
00958                 fprintf((FILE*)fp,"[ ");
00959                 for(unsigned int c=0; c<3; c++)
00960                 {
00961                         fprintf((FILE*)fp,"%.4f ",m.m[r][c]);
00962                 }
00963                 fprintf((FILE*)fp,"]\n");
00964         }
00965 }
00966 
00967 
00968 } 
00969 
00970 
00971 #endif //_NO_LIBRPP_