00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <vector>
00026
00027 #include "WMarchingCubesAlgorithm.h"
00028
00029 WMarchingCubesAlgorithm::WMarchingCubesAlgorithm()
00030 : m_matrix( 4, 4 )
00031 {
00032 }
00033
00034 WPointXYZId WMarchingCubesAlgorithm::interpolate( double fX1, double fY1, double fZ1, double fX2, double fY2, double fZ2,
00035 double tVal1, double tVal2 )
00036 {
00037 WPointXYZId interpolation;
00038 double mu;
00039
00040 mu = static_cast<double>( ( m_tIsoLevel - tVal1 ) ) / ( tVal2 - tVal1 );
00041 interpolation.x = fX1 + mu * ( fX2 - fX1 );
00042 interpolation.y = fY1 + mu * ( fY2 - fY1 );
00043 interpolation.z = fZ1 + mu * ( fZ2 - fZ1 );
00044 interpolation.newID = 0;
00045
00046 return interpolation;
00047 }
00048
00049 int WMarchingCubesAlgorithm::getEdgeID( unsigned int nX, unsigned int nY, unsigned int nZ, unsigned int nEdgeNo )
00050 {
00051 switch ( nEdgeNo )
00052 {
00053 case 0:
00054 return 3 * getVertexID( nX, nY, nZ ) + 1;
00055 case 1:
00056 return 3 * getVertexID( nX, nY + 1, nZ );
00057 case 2:
00058 return 3 * getVertexID( nX + 1, nY, nZ ) + 1;
00059 case 3:
00060 return 3 * getVertexID( nX, nY, nZ );
00061 case 4:
00062 return 3 * getVertexID( nX, nY, nZ + 1 ) + 1;
00063 case 5:
00064 return 3 * getVertexID( nX, nY + 1, nZ + 1 );
00065 case 6:
00066 return 3 * getVertexID( nX + 1, nY, nZ + 1 ) + 1;
00067 case 7:
00068 return 3 * getVertexID( nX, nY, nZ + 1 );
00069 case 8:
00070 return 3 * getVertexID( nX, nY, nZ ) + 2;
00071 case 9:
00072 return 3 * getVertexID( nX, nY + 1, nZ ) + 2;
00073 case 10:
00074 return 3 * getVertexID( nX + 1, nY + 1, nZ ) + 2;
00075 case 11:
00076 return 3 * getVertexID( nX + 1, nY, nZ ) + 2;
00077 default:
00078
00079 return -1;
00080 }
00081 }
00082
00083 unsigned int WMarchingCubesAlgorithm::getVertexID( unsigned int nX, unsigned int nY, unsigned int nZ )
00084 {
00085 return nZ * ( m_nCellsY + 1 ) * ( m_nCellsX + 1) + nY * ( m_nCellsX + 1 ) + nX;
00086 }
00087