wxSphereView.cxx

Go to the documentation of this file.
00001 #include "wxSphereView.h"
00002 
00003 
00004 wxSphereView::wxSphereView( wxWindow *parent, vtkMPRBaseData *vtkmprbasedata, vtkImageData *imageData )
00005 : wxVtk2DBaseView(parent)
00006 {
00007         _delta                          =       1;
00008         _vtkmprbasedata         =       vtkmprbasedata;
00009         _imageDataOriginal      =       imageData;
00010 
00011         _imageSphere            =       vtkImageData::New();
00012         _imageSphere->SetDimensions (150,150,500);
00013         _imageSphere->SetScalarTypeToUnsignedShort();
00014         _imageSphere->AllocateScalars();   
00015         _imageSphere->Update();   
00016 
00017 
00018         vtkBaseData *vtkbasedata = new vtkBaseData();
00019         vtkbasedata->SetMarImageData( new marImageData(_imageSphere) );
00020         this->SetVtkBaseData(vtkbasedata);
00021 
00022     _transform                  =       vtkTransform::New();
00023     _transform1                 =       vtkTransform::New();
00024     _transform2                 =       vtkTransform::New();
00025         _transform ->Identity();
00026         _transform1->Identity();
00027         _transform2->Identity();
00028 
00029         _radio=25;
00030 }
00031 
00032 //-------------------------------------------------------------------
00033 
00034 wxSphereView::~wxSphereView()
00035 {
00036         _transform  -> Delete();
00037         _transform1 -> Delete();
00038         _transform2 -> Delete();
00039         ResetlstId();
00040 }
00041 
00042 //----------------------------------------------------------------------------
00043 
00044 double wxSphereView::GetRadio()
00045 {
00046         return _radio;
00047 }
00048 
00049 //----------------------------------------------------------------------------
00050 
00051 void wxSphereView::SetRadio(double radio)
00052 {
00053         if (radio<0)
00054         {
00055                 radio=0;
00056         }
00057         _radio=radio;
00058 }
00059 
00060 //----------------------------------------------------------------------------
00061 
00062 void wxSphereView::Configure()
00063 {
00064         wxVtk2DBaseView::Configure();
00065 
00066         _vtkinteractorstylesphere = new vtkInteractorStyleSphere();
00067         ((vtkInteractorStyleBaseView*)GetInteractorStyleBaseView())->AddInteractorStyleMaracas( _vtkinteractorstylesphere );
00068         double points[4][3];
00069 
00070 // EED purify 12/sep/2006
00071         int i,j;
00072         for (i=0;i<4;i++)
00073         {
00074                 for (j=0;j<3;j++)
00075                 {
00076                         points[i][j]=0;
00077                 }
00078         }
00079 
00080         InitSphere(points);
00081         DefineImageSphere();
00082 }
00083 
00084 //----------------------------------------------------------------------------
00085 
00086 void wxSphereView::RefreshPoint()
00087 {
00088         double x        = _vtkmprbasedata->GetX() - _centerX;
00089         double y        = _vtkmprbasedata->GetY() - _centerY;
00090         double z        = _vtkmprbasedata->GetZ() - _centerZ;
00091         double alpha= atan2(x,z);
00092         double beta = atan2( y , sqrt(z*z+x*x) );
00093 
00094         alpha           = alpha*180/3.1416;
00095         beta            = beta*180/3.1416;
00096 
00097         _transform1->Identity();
00098         _transform1->RotateY(alpha);
00099         _transform1->RotateX(-beta);
00100 
00101         _radio= sqrt(x*x + y*y +z*z);
00102 
00103         RefreshView();
00104 }
00105 
00106 //----------------------------------------------------------------------------
00107 
00108 void wxSphereView::RefreshView()
00109 {
00110         DefineImageSphere();
00111         wxVtk2DBaseView::Refresh();
00112 }
00113 
00114 //----------------------------------------------------------------------------
00115 
00116 void wxSphereView::RotationEnd()
00117 {
00118         _transform1->RotateWXYZ(_ang,_vxb,_vyb,0);
00119         _transform2->Identity();
00120         SetDeltaVoxel(1);
00121         ResetlstId();
00122 }
00123 
00124 //----------------------------------------------------------------------------
00125 
00126 void wxSphereView::RotationStart(double vx, double vy, bool ok_v, bool ok_ang)
00127 {
00128         if (ok_ang==false)
00129         {
00130                 _ang = -sqrt( vx*vx + vy*vy ) / 1.0;
00131         }
00132 
00133         if (ok_v==false){
00134                 _vxb=-vy;
00135                 _vyb=vx;
00136         }
00137 
00138         _transform2->Identity();
00139         _transform2->RotateWXYZ(_ang,_vxb,_vyb,0);
00140         SetDeltaVoxel(3);
00141         ResetlstId();
00142 }
00143 
00144 //----------------------------------------------------------------------------
00145 
00146 void wxSphereView::GetPointSphere(double p[3],double r1,double angA,double angB)
00147 {
00148         double in[3],out[3];
00149         in[0]=0;   
00150         in[1]=r1;   
00151         in[2]=0;
00152         vtkTransform *transform = vtkTransform::New();
00153         transform->Identity();
00154         transform->RotateX(angB);
00155         transform->RotateZ(angA);
00156         transform->TransformPoint(in,out);
00157         p[0]=out[0];
00158         p[1]=out[1];
00159         p[2]=out[2];
00160         transform->Delete(); 
00161 }
00162 
00163 //----------------------------------------------------------------------------
00164 
00165 void wxSphereView::RotatePointOverTheSphere( double pp[3], double p[3],double cc[3])
00166 {
00167 
00168         double out[3];
00169         _transform->TransformPoint(p,out);
00170         pp[0] = out[0] + cc[0];
00171         pp[1] = out[1] + cc[1];
00172         pp[2] = out[2] + cc[2];
00173 
00174 }
00175 
00176 //----------------------------------------------------------------------------
00177 
00178 void wxSphereView::TransferePoints(double pp1[3],double pp2[3],double AngX,double AngY,vtkImageData *image)
00179 {
00180         double t;
00181         double difX = pp2[0]-pp1[0];
00182         double difY = pp2[1]-pp1[1];
00183         double difZ = pp2[2]-pp1[2];
00184 
00185         double  max             = 200;
00186 
00187         int dimOrg[3];
00188         int dimRes[3];
00189         int z;
00190         _imageDataOriginal->GetDimensions(dimOrg);              
00191         image->GetDimensions(dimRes);           
00192 
00193         int i;
00194         double x1=pp1[0];
00195         double y1=pp1[1];
00196         double z1=pp1[2];
00197         int xx=-1,yy=-1,zz=-1;
00198 
00199         for (i=0;i<max;i++)
00200         {
00201                 t  = i/max;
00202                 xx = (int) (x1+t*difX);
00203                 yy = (int) (y1+t*difY);
00204                 zz = (int) (z1+t*difZ);
00205 
00206                 z=i;
00207                 if ((xx>=0) && (xx<dimOrg[0]) && (yy>=0) && (yy<dimOrg[1]) && (zz>=0) && (zz<dimOrg[2]) &&
00208                         (AngX>=0) && (AngX<dimRes[0]) && (AngY>=0) && (AngY<dimRes[1]) && (z>=0) && (z<dimRes[2]) )
00209                 {
00210                         unsigned short *pOrg=(unsigned short*)_imageDataOriginal->GetScalarPointer (xx,yy,zz); 
00211                         unsigned short *pRes=(unsigned short*)image->GetScalarPointer( (int)AngX , (int)AngY , z ); 
00212                         *pRes=*pOrg;
00213                 }
00214         }
00215 }
00216 
00217 //----------------------------------------------------------------------------
00218 
00219 void wxSphereView::ResetlstId()
00220 {
00221         int i,size=_lstId.size();
00222         for (i=size-1;i>=0;i--)
00223         {
00224                 delete _lstId[i];
00225         }
00226         _lstId.clear();
00227 }
00228 
00229 //----------------------------------------------------------------------------
00230 
00231 int wxSphereView::GetIdOfImage(double radio)
00232 {
00233         int id=0;
00234         int dim[3];     
00235         _imageSphere->GetDimensions(dim);       
00236         int sizeMaxList = dim[2];
00237         // Search in list >> alpha beta radio
00238         int i,size=_lstId.size();
00239         for (i=0; i<size;i++)
00240         {
00241                 //idAlBeRa *tmp=_lstId[i]; // JPRx
00242                 if ((_lstId[i]->_radio==radio) && (_lstId[i]->_deltavoxel==_delta)) 
00243                 {
00244                         return _lstId[i]->_id;
00245                 }
00246         }
00247         if (size>sizeMaxList)
00248         {
00249                 delete _lstId[size-1];
00250                 _lstId.pop_back(); 
00251         }
00252         if (size!=0){
00253                 id=_lstId[0]->_id+1;
00254                 id = id % sizeMaxList;
00255         } else {
00256                 id = 0;
00257         }
00258 
00259         FiltreImage(id,radio);
00260         _lstId.insert(_lstId.begin(),1,new idAlBeRa(id,radio,_delta) ); 
00261 
00262         return id;
00263 }
00264 
00265 //----------------------------------------------------------------------------
00266 
00267 void wxSphereView::DefineImageSphere()
00268 {
00269         int id;
00270         id=GetIdOfImage( _radio );
00271         GetVtkBaseData()->SetZ( id );
00272 }
00273 
00274 
00275 //----------------------------------------------------------------------------
00276 void wxSphereView::SetDeltaVoxel(int delta)
00277 {
00278         _delta=delta;
00279 }
00280 
00281 //----------------------------------------------------------------------------
00282 void wxSphereView::SetVoxel(double i, double j, int delta,double id,  unsigned short gris)
00283 {
00284         int ii,jj,delta2;
00285         unsigned short *pRes;
00286         int dimRes[3];
00287         _imageSphere->GetDimensions(dimRes);
00288 
00289         delta2=delta-1;
00290         for ( ii=(int)(i-delta2) ; ii<=(int)(i+delta2) ; ii++ )
00291         {
00292                 for ( jj=(int)(j-delta2) ; jj<=(int)(j+delta2) ; jj++ )
00293                 {
00294                         if ( (ii>=0)&&(ii<dimRes[0]) &&  
00295                                  (jj>=0)&&(jj<dimRes[1]) )
00296                         {
00297                                 pRes = (unsigned short*)_imageSphere->GetScalarPointer( ii , jj , (int)id );
00298                                 *pRes=gris;
00299                         }
00300                 }
00301         }
00302 
00303 }
00304 
00305 //----------------------------------------------------------------------------
00306 
00307 void wxSphereView::SetXYZtoParent(double i, double j)
00308 {
00309 
00310         double factor = 0.75;
00311         double radio2   = _radio*_radio;
00312         double pxx,pyy,d2x,d2y;
00313         double cc[3],p[3],pp[3];
00314         cc[0]=_centerX;
00315         cc[1]=_centerY;
00316         cc[2]=_centerZ;
00317         double aa;
00318         int dimRes[3],dimOrig[3];
00319         _imageSphere->GetDimensions(dimRes);
00320         d2x=dimRes[0]/2;
00321         d2y=dimRes[1]/2;
00322         _imageDataOriginal->GetDimensions(dimOrig);
00323 
00324         p[0]  = (i - d2x)*factor;
00325         pxx=p[0]*p[0];
00326         p[1]  = (j - d2y)*factor;
00327         pyy=p[1]*p[1];
00328         aa = pxx + pyy;
00329         if (radio2>aa){
00330                 aa=radio2-aa;
00331                 p[2]  = sqrt(aa);
00332                 RotatePointOverTheSphere( pp, p,cc);
00333                 if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
00334                          (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
00335                          (pp[2]>=0) && (pp[2]<dimOrig[2]) )
00336                 {
00337                         if (_vtkmprbasedata){
00338                                 _vtkmprbasedata->SetX(pp[0]);
00339                                 _vtkmprbasedata->SetY(pp[1]);
00340                                 _vtkmprbasedata->SetZ(pp[2]);
00341                         }
00342                 }
00343         }
00344 }
00345 
00346 
00347 //----------------------------------------------------------------------------
00348 
00349 void wxSphereView::FiltreImageB(int id, double radio, bool ok,int deltaTMP)
00350 {       
00351         double factor = 0.75;
00352         double radioB   = radio/3;
00353         double radio2   = radio*radio;
00354         double pxx,pyy,d2x,d2y;
00355         double cc[3],p[3],pp[3];
00356         cc[0]=_centerX;
00357         cc[1]=_centerY;
00358         cc[2]=_centerZ;
00359         double aa;
00360         unsigned short *pOrig;
00361         int dimRes[3],dimOrig[3];
00362         double i,j;
00363         int ext[6];
00364         _imageSphere->GetExtent(ext);
00365         _imageSphere->GetDimensions(dimRes);
00366         //JCP 24 - 04 -09
00367         //_imageSphere->SetExtent(0,dimRes[0]-1,0,dimRes[1]-1,0,dimRes[2]-1);
00368         _imageSphere->SetExtent(ext);
00369         //JCP 24 - 04 -09
00370         d2x=dimRes[0]/2;
00371         d2y=dimRes[1]/2;
00372 //      double deltaTMP=_delta;
00373         _imageDataOriginal->GetDimensions(dimOrig);
00374 
00375         int start,end;
00376         int limitA,limitB;
00377         limitA  = (int) ( (-radioB/factor)+d2x );
00378         limitB  = (int) ( (radioB/factor)+d2x );
00379         if (ok==true){
00380                 start   = limitA;
00381                 end             = limitB;
00382         } else {
00383                 start=0;
00384                 end=dimRes[0];
00385         }
00386 
00387         for ( i=start ; i<end ; i=i+deltaTMP )
00388         {
00389                 p[0]  = (i - d2x)*factor;
00390                 pxx=p[0]*p[0];
00391                 for (j=start;j<end;j=j+deltaTMP)
00392                 {
00393                         p[1]  = (j - d2y)*factor;
00394                         pyy=p[1]*p[1];
00395                         aa = pxx + pyy;
00396 
00397                         if  (( ((ok==false) && (!((i>limitA) && (i<limitB) && (j>limitA) && (j<limitB)))) )
00398                                     ||
00399                                         (ok==true))
00400                         {
00401                                 if (radio2>aa){
00402                                         aa=radio2-aa;
00403                                         p[2]  = sqrt(aa);
00404                                         RotatePointOverTheSphere( pp, p,cc);
00405                                         if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
00406                                                  (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
00407                                                  (pp[2]>=0) && (pp[2]<dimOrig[2]) )
00408                                         {
00409                                                 pOrig=(unsigned short*)_imageDataOriginal->GetScalarPointer( (int)(pp[0]) , (int)(pp[1]) , (int)(pp[2]) ); 
00410                                                 SetVoxel(i,j,deltaTMP,id,*pOrig);
00411                                         } else {
00412                                                 SetVoxel(i,j,deltaTMP,id,2000);
00413                                         }
00414                                 } else {
00415                                         SetVoxel(i,j,deltaTMP,id,0);
00416                                 }
00417                         }
00418                 }
00419         }
00420 
00421         _imageSphere->Modified();  
00422         _imageSphere->Update();
00423 }
00424 
00425 
00426 
00427 
00428 //----------------------------------------------------------------------------
00429 
00430 void wxSphereView::FiltreImage(int id, double radio)
00431 {
00432 
00433         _transform -> Identity();
00434         _transform -> Concatenate(_transform1);
00435         _transform -> Concatenate(_transform2);
00436 
00437         FiltreImageB(id,radio,false, _delta);
00438         FiltreImageB(id,radio,true, 1);
00439 }
00440 
00441 
00442 //----------------------------------------------------------------------------
00443 
00444 /*
00445 void wxSphereView::FiltreImage(int id, double radio)
00446 {
00447         double radio2   = radio*radio;
00448         double radio2TMP= (radio/2)*(radio/2);
00449         double pxx,pyy,d2x,d2y;
00450         double cc[3],p[3],pp[3];
00451         cc[0]=_centerX;
00452         cc[1]=_centerY;
00453         cc[2]=_centerZ;
00454         double aa;
00455         unsigned short *pOrig;
00456         int dimRes[3],dimOrig[3];
00457         double i,j;
00458         _imageSphere->GetDimensions(dimRes);
00459         _imageSphere->SetExtent(0,dimRes[0]-1,0,dimRes[1]-1,0,dimRes[2]-1);
00460         d2x=dimRes[0]/2;
00461         d2y=dimRes[1]/2;
00462         double deltaTMP=_delta;
00463         _imageDataOriginal->GetDimensions(dimOrig);
00464 
00465         for ( i=0 ; i<dimRes[0] ; i=i+deltaTMP )
00466         {
00467                 p[0]  = (i - d2x)*0.75;
00468                 pxx=p[0]*p[0];
00469                 for (j=0;j<dimRes[1];j=j+deltaTMP)
00470                 {
00471                         p[1]  = (j - d2y)*0.75;
00472                         pyy=p[1]*p[1];
00473                         aa = pxx + pyy;
00474 
00475                         if (aa>radio2TMP)
00476                         {
00477                                 if (radio2>aa){
00478                                         aa=radio2-aa;
00479                                         p[2]  = sqrt(aa);
00480                                         RotatePointOverTheSphere( pp, p,cc);
00481                                         if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
00482                                                  (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
00483                                                  (pp[2]>=0) && (pp[2]<dimOrig[2]) )
00484                                         {
00485                                                 pOrig=(unsigned short*)_imageDataOriginal->GetScalarPointer( pp[0] , pp[1] , pp[2] ); 
00486                                                 SetVoxel(i,j,deltaTMP,id,*pOrig);
00487                                         } else {
00488                                                 SetVoxel(i,j,deltaTMP,id,2000);
00489                                         }
00490                                 } else {
00491                                         SetVoxel(i,j,deltaTMP,id,0);
00492                                 }
00493                         }
00494                 }
00495         }
00496 
00497 
00498         deltaTMP=1;
00499         for ( i=0 ; i<dimRes[0] ; i=i+deltaTMP )
00500         {
00501                 p[0]  = (i - d2x)*0.75;
00502                 pxx=p[0]*p[0];
00503                 for (j=0;j<dimRes[1];j=j+deltaTMP)
00504                 {
00505                         p[1]  = (j - d2y)*0.75;
00506                         pyy=p[1]*p[1];
00507                         aa = pxx + pyy;
00508                         if (aa<=radio2TMP)
00509                         {
00510                                 if (radio2>aa){
00511                                         aa=radio2-aa;
00512                                         p[2]  = sqrt(aa);
00513                                         RotatePointOverTheSphere( pp, p,cc);
00514                                         if ( (pp[0]>=0) && (pp[0]<dimOrig[0]) && 
00515                                                  (pp[1]>=0) && (pp[1]<dimOrig[1]) && 
00516                                                  (pp[2]>=0) && (pp[2]<dimOrig[2]) )
00517                                         {
00518                                                 pOrig=(unsigned short*)_imageDataOriginal->GetScalarPointer( pp[0] , pp[1] , pp[2] ); 
00519                                                 SetVoxel(i,j,deltaTMP,id,*pOrig);
00520                                         } else {
00521                                                 SetVoxel(i,j,deltaTMP,id,2000);
00522                                         }
00523                                 } else {
00524                                         SetVoxel(i,j,deltaTMP,id,0);
00525                                 }
00526                         }
00527                 }
00528         }
00529 
00530         _imageSphere->Modified();  
00531         _imageSphere->Update();
00532 }
00533 */
00534 /*
00535 void wxSphereView::FiltreImage(vtkImageData *imageSphere)
00536 {
00537         int dim[3],i,j,k;
00538         imageSphere->GetDimensions(dim);
00539         for (i=0;i<dim[0];i++)
00540         {
00541                 for (j=0;j<dim[1];j++)
00542                 {
00543                         for (k=0;k<dim[2];k++)
00544                         {
00545                                 unsigned short *pRes=(unsigned short*)imageSphere->GetScalarPointer (i,j,k); 
00546                                 *pRes=0;
00547                         }
00548                 }
00549         }
00550 
00551         double deltaA=90;
00552         double cc[3],p1[3],p2[3],pp1[3],pp2[3];
00553         cc[0]=_centerX;
00554         cc[1]=_centerY;
00555         cc[2]=_centerZ;
00556         double r1       = _sl_radio->GetValue() - _sl_thickness->GetValue()/2;
00557         double r2       = _sl_radio->GetValue() + _sl_thickness->GetValue()/2;
00558         if (r1<10)
00559         {
00560                 r1=10;
00561         }
00562         double alpha= _sl_alpha->GetValue();
00563         double beta     = _sl_beta->GetValue();
00564 
00565         double angA,angB;
00566         for (angA=-deltaA;angA<deltaA;angA++)
00567         {
00568                 for (angB=-deltaA;angB<deltaA;angB++)
00569                 {
00570                         GetPointSphere(p1,r1,angA,angB);
00571                         GetPointSphere(p2,r2,angA,angB);
00572                         RotatePointOverTheSphere( pp1, alpha, beta, p1 ,cc );
00573                         RotatePointOverTheSphere( pp2, alpha, beta, p2 ,cc );
00574                         TransferePoints(pp1,pp2,angA+alpha+180,angB+beta+90,imageSphere);
00575                 }
00576         }
00577 }
00578 */
00579 
00580 
00581 //----------------------------------------------------------------------------
00582 
00583 void wxSphereView::InitSphere(double points[4][3])
00584 {
00585         double cc[3];
00586     double r = SphereFindCenter(points,cc); // 4-points , center
00587     if (r > 0)
00588     {
00589         _centerX        = (int)(cc[0]);
00590         _centerY        = (int)(cc[1]);
00591         _centerZ        = (int)(cc[2]);
00592     } else {
00593                 int dim[3];
00594                 _imageDataOriginal->GetDimensions(dim);
00595         _centerX        = (int)(dim[0]/2);
00596         _centerY        = (int)(dim[1]/2);
00597         _centerZ        = (int)(dim[2]/2);
00598         }
00599 }
00600 
00601 //----------------------------------------------------------------------------
00602 
00603 // Calculate center and radius of sphere given four points
00604 // http://home.att.net/~srschmitt/script_sphere_solver.html
00605 // source code HTML <script language=JavaScript>
00606 double wxSphereView::SphereFindCenter(double P[4][3], double cc[3])
00607 {
00608     int i;
00609     double r, m11, m12, m13, m14, m15;
00610         double a[4][4];
00611 
00612     for (i = 0; i < 4; i++)                    // find minor 11
00613     {
00614         a[i][0] = P[i][0];
00615         a[i][1] = P[i][1];
00616         a[i][2] = P[i][2];
00617         a[i][3] = 1;
00618     }
00619     m11 = determinant( a, 4 );
00620 
00621     for (i = 0; i < 4; i++)                    // find minor 12 
00622     {
00623         a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
00624         a[i][1] = P[i][1];
00625         a[i][2] = P[i][2];
00626         a[i][3] = 1;
00627     }
00628     m12 = determinant( a, 4 );
00629 
00630     for (i = 0; i < 4; i++)                    // find minor 13
00631     {
00632         a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
00633         a[i][1] = P[i][0];
00634         a[i][2] = P[i][2];
00635         a[i][3] = 1;
00636     }
00637     m13 = determinant( a, 4 );
00638 
00639     for (i = 0; i < 4; i++)                    // find minor 14
00640     {
00641         a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
00642         a[i][1] = P[i][0];
00643         a[i][2] = P[i][1];
00644         a[i][3] = 1;
00645     }
00646     m14 = determinant( a, 4 );
00647 
00648 
00649     for (i = 0; i < 4; i++)                    // find minor 15
00650     {
00651         a[i][0] = P[i][0]*P[i][0] + P[i][1]*P[i][1] + P[i][2]*P[i][2];
00652         a[i][1] = P[i][0];
00653         a[i][2] = P[i][1];
00654         a[i][3] = P[i][2];
00655     }
00656     m15 = determinant( a, 4 );
00657 
00658     if (m11 == 0)
00659     {
00660         r = 0;
00661     }
00662     else
00663     {
00664                 // center of sphere
00665         cc[0] =  0.5*m12/m11;   //cx                  
00666         cc[1] = -0.5*m13/m11;   //cy
00667         cc[2] =  0.5*m14/m11;   //cz
00668                 // Sphere radio 
00669         r  = sqrt( cc[0]*cc[0] + cc[1]*cc[1] + cc[2]*cc[2] - m15/m11 );
00670     }
00671 
00672     return r;                                  // the radius
00673 }
00674 //----------------------------------------------------------------------------
00675 
00676 //  Recursive definition of determinate using expansion by minors.
00677 double wxSphereView::determinant(double a[4][4], int n)
00678 {
00679     int i, j, j1, j2;
00680     double d;
00681         double m[4][4];
00682 
00683         for (i=0;i<4;i++)
00684         {
00685                 for (j=0;j<4;j++)
00686                 {
00687                         m[i][j]=0;
00688                 }
00689         }
00690 
00691     if (n == 2)                                // terminate recursion
00692     {
00693         d = a[0][0]*a[1][1] - a[1][0]*a[0][1];
00694     }
00695     else 
00696     {
00697         d = 0;
00698         for (j1 = 0; j1 < n; j1++ )            // do each column
00699         {
00700             for (i = 1; i < n; i++)            // create minor
00701             {
00702                 j2 = 0;
00703                 for (j = 0; j < n; j++)
00704                 {
00705                     if (j == j1) continue;
00706                     m[i-1][j2] = a[i][j];
00707                     j2++;
00708                 }
00709             }
00710             
00711             // sum (+/-)cofactor * minor  
00712             d = d + pow(-1.0, j1)*a[0][j1]*determinant( m, n-1 );
00713         }
00714     }
00715 
00716     return d;
00717 }
00718 

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1