]> Creatis software - creaMaracasVisu.git/blob - bbtk/src/bbmaracasvisuAxeVolume.cxx
no message
[creaMaracasVisu.git] / bbtk / src / bbmaracasvisuAxeVolume.cxx
1 #include "bbmaracasvisuAxeVolume.h"
2 #include "bbcreaMaracasVisuPackage.h"
3 namespace bbcreaMaracasVisu
4 {
5
6 BBTK_ADD_BLACK_BOX_TO_PACKAGE(creaMaracasVisu,AxeVolume)
7 BBTK_BLACK_BOX_IMPLEMENTATION(AxeVolume,bbtk::AtomicBlackBox);
8 void AxeVolume::Process()
9 {
10
11         printf("EED AxeVolume::Process start \n");
12
13         if ( mimage!=NULL )
14         {
15                 mimage->Delete();
16         }
17
18         int ext[6];
19         bbGetInputIn()->GetExtent(ext);
20         int sizeX=ext[1]-ext[0];
21         int sizeY=ext[3]-ext[2];
22         int sizeZ=ext[5]-ext[4];
23
24     double spc[3];
25         bbGetInputIn()->GetSpacing(spc);
26     double invSpc[3];
27     invSpc[0] = 1/spc[0];
28     invSpc[1] = 1/spc[1];
29     invSpc[2] = 1/spc[2];
30
31 printf("EED AxeVolume::Process invSpc %f %f %f\n",invSpc[0],invSpc[1],invSpc[2] );
32
33         mimage = vtkImageData::New();
34         mimage->SetDimensions(sizeX,sizeY,sizeZ);
35         mimage->SetOrigin(0,0,0);
36         mimage->SetExtent( 0 , sizeX-1 , 0 , sizeY-1 , 0, sizeZ-1 );
37         mimage->SetWholeExtent( 0 , sizeX-1 , 0 , sizeY-1 , 0, sizeZ-1 );
38         mimage->SetScalarTypeToUnsignedShort();
39         mimage->SetSpacing(spc);
40         mimage->AllocateScalars();
41
42
43         int i,j,k;
44     int sizeLstPointR = bbGetInputlstPointR().size();
45         int iAxe,sizeAxe=bbGetInputlstPointX().size();
46         double rx,ry,rz;
47         double r,rr;
48         unsigned short *p;
49         int sizeImage = sizeX*sizeY*sizeZ;
50         double px,py,pz,px1,py1,pz1,px2,py2,pz2;
51
52         // Clean image
53         p = (unsigned short*)mimage->GetScalarPointer (0, 0, 0);
54         for ( i=0 ; i<sizeImage ; i++)
55         {
56                 *p = 0;
57                 p++;
58         }
59
60         for (iAxe=0 ; iAxe<sizeAxe; iAxe++)
61          {
62                 if (sizeLstPointR<iAxe)
63                 {
64                         if (bbGetInputlstPointR().size()>=1)
65                         {
66                                 r = bbGetInputlstPointR()[ bbGetInputlstPointR().size()-1 ]    * invSpc[0];
67                         } else {
68                                 r = 1;
69                         }
70                 } else {
71                         r = bbGetInputlstPointR()[ iAxe ]* invSpc[0];
72                 }
73                 px = bbGetInputlstPointX()[iAxe] * invSpc[0];
74                 py = bbGetInputlstPointY()[iAxe] * invSpc[1];
75                 pz = bbGetInputlstPointZ()[iAxe] * invSpc[2];
76                  printf("AxeVolume::Process %d ->  %f, %f, %f,%f\n",iAxe, px,py,pz,r);
77                 px1 = px - r;
78                 py1 = py - r;
79                 pz1 = pz - r;
80                 px2 = px + r;
81                 py2 = py + r;
82                 pz2 = pz + r;
83                 rr=r*r;
84
85                 for ( i=px1 ; i<=px2 ; i++ )
86                 {
87                         rx      =       i - px;
88                         rx      =       rx*rx;
89                         for ( j=py1 ; j<py2 ; j++ )
90                         {
91                                 ry      =       j - py;
92                                 ry      =       ry*ry;
93                                 for ( k=pz1 ; k<pz2 ; k++ )
94                                 {
95                                         if ( (i>=0) && (i<sizeX) && (j>=0) && (j<sizeY) &&(k>=0) && (k<sizeZ) ){
96                                                 p = (unsigned short*)mimage->GetScalarPointer (i, j, k);
97                                                 if (*p==0)
98                                                 {
99                                                         rz      =       k - pz;
100                                                         rz      =       rz*rz;
101                                                         if ( rx + ry + rz <= rr )
102                                                         {
103                                                                 *p=255;
104                                                         }
105                                                 } // *p==0
106                                         } // inside point
107                                 } //for k
108                         } //for j
109                 } //for i
110         } // for iAxe
111     bbSetOutputOut( mimage );
112
113         printf("EED AxeVolume::Process end \n");
114
115 }
116
117
118         //-----------------------------------------------------------------
119         void AxeVolume::bbUserSetDefaultValues()
120         {
121                 mimage=NULL;
122         }
123
124         //-----------------------------------------------------------------
125         void AxeVolume::bbUserInitializeProcessing()
126         {
127         }
128
129         //-----------------------------------------------------------------
130         void AxeVolume::bbUserFinalizeProcessing()
131         {
132         }
133
134         //-----------------------------------------------------------------
135
136 }
137 // EO namespace bbcreaMaracasVisu
138
139