Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

BCC/Unimodal/3d/3d.cpp

Go to the documentation of this file.
00001 #include "3d.h"
00002 #include <fstream.h>
00003 #include <stdio.h>
00004 #include <GL/gl.h>
00005 
00006 //----------------------------------------------------------------------------
00007 //------------------------- The default constructor --------------------------
00008 //----------------------------------------------------------------------------
00009 
00010 vu1512::vu1512()
00011 {
00012     m_Dim1Size = 0;
00013     m_Dim2Size = 0;
00014     m_Dim3Size = 0;
00015 
00016     m_Spacing = 0;
00017 
00018     m_Dim1Origin = 0;
00019     m_Dim2Origin = 0;
00020     m_Dim3Origin = 0;
00021 }
00022 
00023 //----------------------------------------------------------------------------
00024 //------------------------- The copy constructor -----------------------------
00025 //----------------------------------------------------------------------------
00026 
00027 vu1512::vu1512(const vu1512& inst) : vu151(inst)
00028 {
00029     m_Dim1Size = inst.m_Dim1Size;
00030     m_Dim2Size = inst.m_Dim2Size;
00031     m_Dim3Size = inst.m_Dim3Size;
00032 
00033     m_Spacing = inst.m_Spacing;
00034 
00035     m_Dim1Origin = inst.m_Dim1Origin;
00036     m_Dim2Origin = inst.m_Dim2Origin;
00037     m_Dim3Origin = inst.m_Dim3Origin;
00038 }
00039 
00040 //----------------------------------------------------------------------------
00041 //------------------------- The assignment operator --------------------------
00042 //----------------------------------------------------------------------------
00043 
00044 vu1512& vu1512::operator=(const vu1512& rhs)
00045 {
00046     if (this != &rhs)
00047     {
00048         m_Dim1Size = rhs.m_Dim1Size;
00049         m_Dim2Size = rhs.m_Dim2Size;
00050         m_Dim3Size = rhs.m_Dim3Size;
00051 
00052         m_Spacing = rhs.m_Spacing;
00053 
00054         m_Dim1Origin = rhs.m_Dim1Origin;
00055         m_Dim2Origin = rhs.m_Dim2Origin;
00056         m_Dim3Origin = rhs.m_Dim3Origin;
00057         vu151::operator=(rhs);
00058     }
00059     return *this;
00060 }
00061 
00062 //----------------------------------------------------------------------------
00063 //------------------------- The set/get methods ------------------------------
00064 //----------------------------------------------------------------------------
00065 
00066 dword vu1512::getDim1Size(void) const
00067 {
00068     return m_Dim1Size;
00069 }
00070 
00071 dword vu1512::getDim2Size(void) const
00072 {
00073     return m_Dim2Size;
00074 }
00075 
00076 dword vu1512::getDim3Size(void) const
00077 {
00078     return m_Dim3Size;
00079 }
00080 
00081 dword vu1512::getSpacing(void) const
00082 {
00083     return m_Spacing;
00084 }
00085 
00086 int vu1512::getDim1Origin(void) const
00087 {
00088     return m_Dim1Origin;
00089 }
00090 
00091 int vu1512::getDim2Origin(void) const
00092 {
00093     return m_Dim2Origin;
00094 }
00095 
00096 int vu1512::getDim3Origin(void) const
00097 {
00098     return m_Dim3Origin;
00099 }
00100 
00101 //----------------------------------------------------------------------------
00102 //------------------------- protected read() ---------------------------------
00103 //----------------------------------------------------------------------------
00104 
00105 bool vu1512::read(FILE *file)
00106 {
00107     int ret = 0;
00108 
00109     bool success = vu151::read(file);
00110     if (!success) return false;
00111 
00112     //Read in the dimensions of the data
00113     dword d4=0;
00114     ret = fscanf(file,"DIMENSIONS %lu %lu %lu %lu ",&m_Dim1Size,&m_Dim2Size,
00115           &m_Dim3Size,&d4);
00116     if (ret != 4) return setInvalidFormatError();
00117 
00118     //Read in the origin of the data
00119     int do4=0;
00120     ret = fscanf(file,"ORIGIN %i %i %i %i ",&m_Dim1Origin,&m_Dim2Origin,
00121                  &m_Dim3Origin,&do4);
00122     if (ret != 4) return setInvalidFormatError();
00123 
00124     //Read in the spacing of the data
00125     dword ds1,ds2,ds3,ds4;
00126     ret = fscanf(file,"SPACING %lu %lu %lu %lu ",&ds1,&ds2,&ds3,&ds4);
00127     if (ret != 4) return setInvalidFormatError();
00128     m_Spacing = ds1;
00129 
00130     //Read in the number of data points stored in the file.
00131     ret = fscanf(file,"POINT_DATA %lu ",&m_DataSize);
00132     if (ret != 1) return setInvalidFormatError();
00133 
00134     //Make sure that this is 3d data and that it's valid.
00135     if ( (m_Dim1Size<=1) || (m_Dim2Size<=1) || (m_Dim3Size<=1) || (d4!=1) )
00136         return setInvalidFormatError();
00137     else if ( (ds1 != ds2) || (ds2 != ds3))
00138         return setInvalidFormatError();
00139     else if (m_DataSize != (m_Dim1Size * m_Dim2Size * m_Dim3Size))
00140         return setInvalidFormatError();
00141 
00142     return true;
00143 }
00144 
00145 //----------------------------------------------------------------------------
00146 //------------------------- protected write() --------------------------------
00147 //----------------------------------------------------------------------------
00148 
00149 bool vu1512::write(FILE *file)
00150 {
00151     int ret = 0;
00152     
00153     bool success = vu151::write(file);
00154     if (!success) return false;
00155 
00156     //Write the dimensions of the data
00157     ret = fprintf(file,"DIMENSIONS %lu %lu %lu %lu\n",m_Dim1Size,m_Dim2Size,
00158           m_Dim3Size,(dword)1);
00159     
00160     //Write the origin of the data
00161     ret = fprintf(file,"ORIGIN %i %i %i %i\n",m_Dim1Origin,m_Dim2Origin,
00162           m_Dim3Origin,0);
00163     
00164     //Write the spacing of the data
00165     ret = fprintf(file,"SPACING %lu %lu %lu %lu\n",m_Spacing,m_Spacing,
00166           m_Spacing,(dword)0);
00167 
00168     //Write the total number of data points.
00169     ret = fprintf(file,"POINT_DATA %lu\n",m_DataSize);
00170     
00171     if (ret > 0)
00172         return true;
00173     else
00174         return setWriteError();
00175 }
00176 
00177 
00178 //----------------------------------------------------------------------------
00179 vuVector vu1512::getVoxelPosition(int x, int y, int z) const
00180 {
00181   vuVector pos;
00182   if(z&0x01){
00183     //secondary grid
00184     pos[0] = (float(x)+0.5)*T;
00185     pos[1] = (float(y)+0.5)*T;
00186     pos[2] = (float(z))*(T*0.5);
00187   } else {
00188     //primary grid
00189     pos[0] = float(x)*T;
00190     pos[1] = float(y)*T;
00191     pos[2] = float(z)*(T*0.5);
00192   }
00193 
00194   return pos;
00195 }
00196 
00197 void vu1512::preview(int hint)
00198 {
00199   vuCamera *camera = getCameraPtr();
00200 
00201   if (camera != NULL) {
00202     glEnable(GL_DEPTH_TEST);
00203     glDepthFunc(GL_LESS);
00204     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
00205 
00206     //Set the viewport.
00207     camera->glViewport();
00208 
00209     //Set the opengl projection matrix.
00210     glMatrixMode(GL_PROJECTION);
00211     glLoadIdentity();
00212 
00213     camera->glInit();
00214     glMatrixMode(GL_MODELVIEW);
00215     glLoadIdentity();
00216     camera->gluLookAt();
00217 
00218     // min. image and max. volume extensions
00219     int   minImg = camera->getWidth();
00220     vuVector volsiz(getVoxelPosition(m_Dim1Size, m_Dim2Size, m_Dim3Size));
00221     dword maxVol = (dword)((volsiz[0] > volsiz[1]) ? volsiz[0] : volsiz[1]);
00222 
00223     minImg = (minImg < camera->getHeight()) ? minImg : camera->getHeight();
00224     maxVol = (dword)((maxVol > volsiz[2])          ? maxVol : volsiz[2]);
00225 
00226     float fac = (float)maxVol/(float)minImg;
00227     fac*=1.5; // make it 50% bigger
00228 
00229     // draw the box
00230     drawBox((float)volsiz[0]*fac,(float)volsiz[1]*fac,(float)volsiz[2]*fac);
00231   }
00232   else {
00233     cerr << "Warning: Could not draw preview. No Camera set." << endl;
00234   }
00235 }
00236 
00237 void vu1512::drawBox(float sx, float sy, float sz)
00238 {
00239   static GLfloat n[6][3] = {  /* Normals for the 6 faces of a cube. */
00240     {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
00241     {0.0, -1.0, 0.0}, {0.0, 0.0, -1.0}, {0.0, 0.0, 1.0} };
00242   static GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */
00243     {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
00244     {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
00245   static GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */
00246 
00247   sx = sx/2;
00248   sy = sy/2;
00249   sz = sz/2;
00250 
00251   vuVector center(getCenter());
00252   glTranslatef(center[0], center[1], center[2]);
00253 
00254   /* Setup cube vertex data. */
00255   v[0][0] = v[1][0] = v[2][0] = v[3][0] = -sx;
00256   v[4][0] = v[5][0] = v[6][0] = v[7][0] = sx;
00257   v[0][1] = v[1][1] = v[4][1] = v[5][1] = -sy;
00258   v[2][1] = v[3][1] = v[6][1] = v[7][1] = sy;
00259   v[0][2] = v[3][2] = v[4][2] = v[7][2] = sz;
00260   v[1][2] = v[2][2] = v[5][2] = v[6][2] = -sz;
00261 
00262   int i;
00263   for (i = 0; i < 6; i++) {
00264     glBegin(GL_LINE_LOOP);
00265     glNormal3fv(&n[i][0]);
00266     glColor3fv(v[faces[i][0]]);
00267     glVertex3fv(&v[faces[i][0]][0]);
00268     glColor3fv(v[faces[i][1]]);
00269     glVertex3fv(&v[faces[i][1]][0]);
00270     glColor3fv(v[faces[i][2]]);
00271     glVertex3fv(&v[faces[i][2]][0]);
00272     glColor3fv(v[faces[i][3]]);
00273     glVertex3fv(&v[faces[i][3]][0]);
00274     glEnd();
00275   }
00276 }

Generated on Wed Dec 15 21:20:27 2004 for vuVolume by  doxygen 1.3.9.1