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 #ifndef WMARCHINGCUBESALGORITHM_TEST_H
00026 #define WMARCHINGCUBESALGORITHM_TEST_H
00027
00028 #include <vector>
00029 #include <cxxtest/TestSuite.h>
00030
00031 #include "../WMarchingCubesAlgorithm.h"
00032
00033
00034
00035
00036 class WMarchingCubesAlgorithmTest : public CxxTest::TestSuite
00037 {
00038 public:
00039
00040
00041
00042
00043 void testInterpolate()
00044 {
00045 WMarchingCubesAlgorithm mc;
00046 mc.m_tIsoLevel = 1.7;
00047
00048 WPointXYZId expected;
00049 expected.newID = 0;
00050 expected.x = 1.3545454545454545;
00051 expected.y = 2.4545454545454545;
00052 expected.z = 5.4090909090909091;
00053
00054 WPointXYZId result = mc.interpolate( 1.3, 2.4, 3.5,
00055 1.4, 2.5, 7.0,
00056 1.1, 2.2 );
00057
00058 double delta = 1e-9;
00059 TS_ASSERT_DELTA( expected.x, result.x, delta );
00060 TS_ASSERT_DELTA( expected.y, result.y, delta );
00061 TS_ASSERT_DELTA( expected.z, result.z, delta );
00062 TS_ASSERT_EQUALS( expected.newID, result.newID );
00063 }
00064
00065
00066
00067
00068 void testGetVertexID()
00069 {
00070 WMarchingCubesAlgorithm mc;
00071 mc.m_nCellsX = 10;
00072 mc.m_nCellsY = 11;
00073 mc.m_nCellsZ = 12;
00074
00075 unsigned int x = 4;
00076 unsigned int y = 5;
00077 unsigned int z = 6;
00078
00079 unsigned int nbVertsInXDir = ( mc.m_nCellsX + 1 );
00080 unsigned int nbVertsInSlice = nbVertsInXDir * ( mc.m_nCellsY + 1 );
00081 unsigned int expected = z * nbVertsInSlice + y * nbVertsInXDir + x;
00082
00083 TS_ASSERT_EQUALS( expected, mc.getVertexID( x, y, z ) );
00084 }
00085
00086
00087
00088
00089 void testGetEdgeID()
00090 {
00091 WMarchingCubesAlgorithm mc;
00092 mc.m_nCellsX = 10;
00093 mc.m_nCellsY = 11;
00094 mc.m_nCellsZ = 12;
00095
00096 unsigned int nbVertsInXDir = ( mc.m_nCellsX + 1 );
00097 unsigned int nbVertsInSlice = nbVertsInXDir * ( mc.m_nCellsY + 1 );
00098
00099
00100 TS_ASSERT_EQUALS( 1 , mc.getEdgeID( 0, 0, 0, 0 ) );
00101 TS_ASSERT_EQUALS( 3 * nbVertsInXDir , mc.getEdgeID( 0, 0, 0, 1 ) );
00102 TS_ASSERT_EQUALS( 3 * 1 + 1 , mc.getEdgeID( 0, 0, 0, 2 ) );
00103 TS_ASSERT_EQUALS( 0 , mc.getEdgeID( 0, 0, 0, 3 ) );
00104 TS_ASSERT_EQUALS( 3 * nbVertsInSlice + 1 , mc.getEdgeID( 0, 0, 0, 4 ) );
00105 TS_ASSERT_EQUALS( 3 * ( nbVertsInSlice + nbVertsInXDir ), mc.getEdgeID( 0, 0, 0, 5 ) );
00106 TS_ASSERT_EQUALS( 3 * ( 1 + nbVertsInSlice ) + 1, mc.getEdgeID( 0, 0, 0, 6 ) );
00107 TS_ASSERT_EQUALS( 3 * nbVertsInSlice, mc.getEdgeID( 0, 0, 0, 7 ) );
00108 TS_ASSERT_EQUALS( 2 , mc.getEdgeID( 0, 0, 0, 8 ) );
00109 TS_ASSERT_EQUALS( 3 * nbVertsInXDir + 2, mc.getEdgeID( 0, 0, 0, 9 ) );
00110 TS_ASSERT_EQUALS( 3 * ( 1 + nbVertsInXDir ) + 2, mc.getEdgeID( 0, 0, 0, 10 ) );
00111 TS_ASSERT_EQUALS( 3 * 1 + 2, mc.getEdgeID( 0, 0, 0, 11 ) );
00112
00113
00114 TS_ASSERT_EQUALS( -1 , mc.getEdgeID( 0, 0, 0, -1 ) );
00115 TS_ASSERT_EQUALS( -1 , mc.getEdgeID( 0, 0, 0, 12 ) );
00116 TS_ASSERT_DIFFERS( -1 , mc.getEdgeID( 0, 0, 0, 1 ) );
00117 }
00118
00119
00120
00121
00122 void testCalculateIntersectionUnsignedChar()
00123 {
00124 WMarchingCubesAlgorithm mc;
00125 mc.m_tIsoLevel = 1.7;
00126 mc.m_nCellsX = 1;
00127 mc.m_nCellsY = 1;
00128 mc.m_nCellsZ = 1;
00129
00130 std::vector< unsigned char > data;
00131 data.push_back( 0 );
00132 data.push_back( 1 );
00133 data.push_back( 2 );
00134 data.push_back( 3 );
00135 data.push_back( 4 );
00136 data.push_back( 5 );
00137 data.push_back( 6 );
00138 data.push_back( 7 );
00139
00140 WPointXYZId expected;
00141 expected.newID = 0;
00142 expected.x = 1;
00143 expected.y = 0.35;
00144 expected.z = 0;
00145
00146
00147 WPointXYZId result = mc.calculateIntersection( &data, 0, 0, 0, 2 );
00148
00149 double delta = 1e-9;
00150 TS_ASSERT_DELTA( expected.x, result.x, delta );
00151 TS_ASSERT_DELTA( expected.y, result.y, delta );
00152 TS_ASSERT_DELTA( expected.z, result.z, delta );
00153 TS_ASSERT_EQUALS( expected.newID, result.newID );
00154 }
00155
00156
00157
00158
00159
00160 void testCalculateIntersectionFloat()
00161 {
00162 WMarchingCubesAlgorithm mc;
00163 mc.m_tIsoLevel = 1.7;
00164 mc.m_nCellsX = 1;
00165 mc.m_nCellsY = 1;
00166 mc.m_nCellsZ = 1;
00167
00168 std::vector< float > data;
00169 data.push_back( 0 );
00170 data.push_back( 1 );
00171 data.push_back( 2 );
00172 data.push_back( 3 );
00173 data.push_back( 4 );
00174 data.push_back( 5 );
00175 data.push_back( 6 );
00176 data.push_back( 7 );
00177
00178 WPointXYZId expected;
00179 expected.newID = 0;
00180 expected.x = 1;
00181 expected.y = 0.35;
00182 expected.z = 0;
00183
00184
00185 WPointXYZId result = mc.calculateIntersection( &data, 0, 0, 0, 2 );
00186
00187 double delta = 1e-9;
00188 TS_ASSERT_DELTA( expected.x, result.x, delta );
00189 TS_ASSERT_DELTA( expected.y, result.y, delta );
00190 TS_ASSERT_DELTA( expected.z, result.z, delta );
00191 TS_ASSERT_EQUALS( expected.newID, result.newID );
00192 }
00193 };
00194
00195 #endif // WMARCHINGCUBESALGORITHM_TEST_H