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
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
00238 int i,size=_lstId.size();
00239 for (i=0; i<size;i++)
00240 {
00241
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
00367
00368 _imageSphere->SetExtent(ext);
00369
00370 d2x=dimRes[0]/2;
00371 d2y=dimRes[1]/2;
00372
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
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
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);
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
00604
00605
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++)
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++)
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++)
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++)
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++)
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
00665 cc[0] = 0.5*m12/m11;
00666 cc[1] = -0.5*m13/m11;
00667 cc[2] = 0.5*m14/m11;
00668
00669 r = sqrt( cc[0]*cc[0] + cc[1]*cc[1] + cc[2]*cc[2] - m15/m11 );
00670 }
00671
00672 return r;
00673 }
00674
00675
00676
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)
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++ )
00699 {
00700 for (i = 1; i < n; i++)
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
00712 d = d + pow(-1.0, j1)*a[0][j1]*determinant( m, n-1 );
00713 }
00714 }
00715
00716 return d;
00717 }
00718