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

Regular/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 vu1112::vu1112()
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 vu1112::vu1112(const vu1112& inst) : vu111(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 vu1112& vu1112::operator=(const vu1112& 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         vu111::operator=(rhs);
00058     }
00059     return *this;
00060 }
00061 
00062 //----------------------------------------------------------------------------
00063 //------------------------- The set/get methods ------------------------------
00064 //----------------------------------------------------------------------------
00065 
00066 dword vu1112::getDim1Size(void) const
00067 {
00068     return m_Dim1Size;
00069 }
00070 
00071 dword vu1112::getDim2Size(void) const
00072 {
00073     return m_Dim2Size;
00074 }
00075 
00076 dword vu1112::getDim3Size(void) const
00077 {
00078     return m_Dim3Size;
00079 }
00080 
00081 dword vu1112::getSpacing(void) const
00082 {
00083     return m_Spacing;
00084 }
00085 
00086 int vu1112::getDim1Origin(void) const
00087 {
00088     return m_Dim1Origin;
00089 }
00090 
00091 int vu1112::getDim2Origin(void) const
00092 {
00093     return m_Dim2Origin;
00094 }
00095 
00096 int vu1112::getDim3Origin(void) const
00097 {
00098     return m_Dim3Origin;
00099 }
00100 
00101 //----------------------------------------------------------------------------
00102 //------------------------- protected read() ---------------------------------
00103 //----------------------------------------------------------------------------
00104 
00105 bool vu1112::read(FILE *file)
00106 {
00107     int ret = 0;
00108 
00109     bool success = vu111::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     //Read in the origin of the data
00118     int do4=0;
00119     ret = fscanf(file,"ORIGIN %i %i %i %i ",&m_Dim1Origin,&m_Dim2Origin,
00120                  &m_Dim3Origin,&do4);
00121     if (ret != 4) return setInvalidFormatError();
00122     //Read in the spacing of the data
00123     dword ds1,ds2,ds3,ds4;
00124     ret = fscanf(file,"SPACING %lu %lu %lu %lu ",&ds1,&ds2,&ds3,&ds4);
00125     if (ret != 4) return setInvalidFormatError();
00126     m_Spacing = ds1;
00127     //Read in the number of data points stored in the file.
00128     ret = fscanf(file,"POINT_DATA %lu ",&m_DataSize);
00129     if (ret != 1) return setInvalidFormatError();
00130     //Make sure that this is 3d data and that it's valid.
00131     if ( (m_Dim1Size<=1) || (m_Dim2Size<=1) || (m_Dim3Size<=1) || (d4!=1) )
00132         return setInvalidFormatError();
00133     else if ( (ds1 != ds2) || (ds2 != ds3))
00134         return setInvalidFormatError();
00135 //moved to 1B::read and 2B::read
00136 //    else if (m_DataSize != (m_Dim1Size * m_Dim2Size * m_Dim3Size))
00137 //        return setInvalidFormatError();
00138 
00139     return true;
00140 }
00141 
00142 //----------------------------------------------------------------------------
00143 //------------------------- protected write() --------------------------------
00144 //----------------------------------------------------------------------------
00145 
00146 bool vu1112::write(FILE *file)
00147 {
00148     int ret = 0;
00149     
00150     bool success = vu111::write(file);
00151     if (!success) return false;
00152 
00153     //Write the dimensions of the data
00154     ret = fprintf(file,"DIMENSIONS %lu %lu %lu %lu\n",m_Dim1Size,m_Dim2Size,
00155           m_Dim3Size,(dword)1);
00156     
00157     //Write the origin of the data
00158     ret = fprintf(file,"ORIGIN %i %i %i %i\n",m_Dim1Origin,m_Dim2Origin,
00159           m_Dim3Origin,0);
00160     
00161     //Write the spacing of the data
00162     ret = fprintf(file,"SPACING %lu %lu %lu %lu\n",m_Spacing,m_Spacing,
00163           m_Spacing,(dword)0);
00164 
00165     //Write the total number of data points.
00166     ret = fprintf(file,"POINT_DATA %lu\n",m_DataSize);
00167     
00168     if (ret > 0)
00169         return true;
00170     else
00171         return setWriteError();
00172 }
00173 
00174 void vu1112::preview(int hint)
00175 {
00176   vuCamera *camera = getCameraPtr();
00177 
00178   if (camera != NULL) {
00179     glEnable(GL_DEPTH_TEST);
00180     glDepthFunc(GL_LESS);
00181     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
00182 
00183     //Set the viewport.
00184     camera->glViewport();
00185 
00186     //Set the opengl projection matrix.
00187     glMatrixMode(GL_PROJECTION);
00188     glLoadIdentity();
00189 
00190     camera->glInit();
00191     glMatrixMode(GL_MODELVIEW);
00192     glLoadIdentity();
00193     camera->gluLookAt();
00194 
00195     // min. image and max. volume extensions
00196     int   minImg = camera->getWidth();
00197     dword maxVol = (m_Dim1Size > m_Dim2Size) ? m_Dim1Size : m_Dim2Size;
00198 
00199     minImg = (minImg < camera->getHeight()) ? minImg : camera->getHeight();
00200     maxVol = (maxVol > m_Dim3Size)          ? maxVol : m_Dim3Size;
00201 
00202     float fac = (float)maxVol/(float)minImg;
00203     fac*=1.5; // make it 50% bigger
00204 
00205     // draw the box
00206     drawBox((float)m_Dim1Size*fac,(float)m_Dim2Size*fac,(float)m_Dim3Size*fac);
00207   }
00208   else {
00209     cerr << "Warning: Could not draw preview. No Camera set." << endl;
00210   }
00211 }
00212 
00213 void vu1112::drawBox(float sx, float sy, float sz)
00214 {
00215   static GLfloat n[6][3] = {  /* Normals for the 6 faces of a cube. */
00216     {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
00217     {0.0, -1.0, 0.0}, {0.0, 0.0, -1.0}, {0.0, 0.0, 1.0} };
00218   static GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */
00219     {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
00220     {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
00221   static GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */
00222 
00223   sx = sx/2;
00224   sy = sy/2;
00225   sz = sz/2;
00226 
00227   glTranslatef(m_Dim1Size/2,m_Dim2Size/2,m_Dim3Size/2);
00228 
00229   /* Setup cube vertex data. */
00230   v[0][0] = v[1][0] = v[2][0] = v[3][0] = -sx;
00231   v[4][0] = v[5][0] = v[6][0] = v[7][0] = sx;
00232   v[0][1] = v[1][1] = v[4][1] = v[5][1] = -sy;
00233   v[2][1] = v[3][1] = v[6][1] = v[7][1] = sy;
00234   v[0][2] = v[3][2] = v[4][2] = v[7][2] = sz;
00235   v[1][2] = v[2][2] = v[5][2] = v[6][2] = -sz;
00236 
00237   int i;
00238   for (i = 0; i < 6; i++) {
00239     glBegin(GL_LINE_LOOP);
00240     glNormal3fv(&n[i][0]);
00241     glColor3fv(v[faces[i][0]]);
00242     glVertex3fv(&v[faces[i][0]][0]);
00243     glColor3fv(v[faces[i][1]]);
00244     glVertex3fv(&v[faces[i][1]][0]);
00245     glColor3fv(v[faces[i][2]]);
00246     glVertex3fv(&v[faces[i][2]][0]);
00247     glColor3fv(v[faces[i][3]]);
00248     glVertex3fv(&v[faces[i][3]][0]);
00249     glEnd();
00250   }
00251 }

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