25 #ifndef WMARCHINGLEGOALGORITHM_H
26 #define WMARCHINGLEGOALGORITHM_H
30 #include "../../common/math/WMatrix.h"
31 #include "../../common/WProgressCombiner.h"
32 #include "../WTriangleMesh.h"
33 #include "../WExportWGE.h"
46 typedef std::map< unsigned int, WMLPointXYZId > ID2WMLPointXYZId;
56 typedef std::vector<WMLTriangle> WMLTriangleVECTOR;
89 template<
typename T >
90 boost::shared_ptr< WTriangleMesh > generateSurface(
size_t nbCoordsX,
size_t nbCoordsY,
size_t nbCoordsZ,
92 const std::vector< T >* vals,
109 boost::shared_ptr< WTriangleMesh > genSurfaceOneValue(
size_t nbCoordsX,
size_t nbCoordsY,
size_t nbCoordsZ,
111 const std::vector< size_t >* vals,
123 void addSurface(
size_t x,
size_t y,
size_t z,
size_t surface );
132 size_t getVertexID(
size_t nX,
size_t nY,
size_t nZ );
148 const std::vector< T >* vals,
151 WAssert( vals,
"No value set provided." );
164 size_t nX = nbCoordsX;
165 size_t nY = nbCoordsY;
167 size_t nPointsInSlice = nX * nY;
176 if( ( *vals )[ z * nPointsInSlice + y * nX + x ] <
m_tIsoLevel )
181 if( x > 0 && ( ( *vals )[ z * nPointsInSlice + y * nX + x - 1 ] <
m_tIsoLevel ) )
185 if( x < m_nCellsX - 1 && ( ( *vals )[ z * nPointsInSlice + y * nX + x + 1 ] <
m_tIsoLevel ) )
190 if( y > 0 && ( ( *vals )[ z * nPointsInSlice + ( y - 1 ) * nX + x ] <
m_tIsoLevel ) )
195 if( y < m_nCellsY - 1 && ( ( *vals )[ z * nPointsInSlice + ( y + 1 ) * nX + x ] <
m_tIsoLevel ) )
200 if( z > 0 && ( ( *vals )[ ( z - 1 ) * nPointsInSlice + y * nX + x ] <
m_tIsoLevel ) )
205 if( z < m_nCellsZ - 1 && ( ( *vals )[ ( z + 1 ) * nPointsInSlice + y * nX + x ] <
m_tIsoLevel ) )
214 if( x == m_nCellsX - 1 )
224 if( y == m_nCellsY - 1 )
234 if( z == m_nCellsZ - 1 )
241 unsigned int nextID = 0;
249 mapIterator->second.y / nbCoordsY,
250 mapIterator->second.z / nbCoordsZ );
253 WPosition pos =
WPosition( mapIterator->second.x, mapIterator->second.y, mapIterator->second.z );
255 std::vector< double > resultPos4D( 4 );
261 ( *mapIterator ).second.newID = nextID;
262 triMesh->addVertex( resultPos4D[0] / resultPos4D[3],
263 resultPos4D[1] / resultPos4D[3],
264 resultPos4D[2] / resultPos4D[3] );
265 triMesh->addTextureCoordinate( texCoord );
274 for(
unsigned int i = 0; i < 3; i++ )
276 unsigned int newID =
m_idToVertices[( *vecIterator ).pointID[i]].newID;
277 ( *vecIterator ).pointID[i] = newID;
279 triMesh->addTriangle( ( *vecIterator ).pointID[0], ( *vecIterator ).pointID[1], ( *vecIterator ).pointID[2] );
284 #endif // WMARCHINGLEGOALGORITHM_H