ITK/InsightClopedia/Meshes: Difference between revisions

From KitwarePublic
Jump to navigationJump to search
(New page: This example demonstrates how to add points and edges to a mesh. <source lang="cpp"> #include "itkMesh.h" #include "itkLineCell.h" const unsigned int Dimension = 3; typedef itk::Mesh< fl...)
 
No edit summary
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
This example demonstrates how to add points and edges to a mesh.
For N-D meshes, use itkMesh. For 2D surfaces embedded in 3D, use itkQuadEdgeMesh (in the Review directory).


<source lang="cpp">
[[ITK/InsightClopedia/Meshes/AddPointsAndEdges|Add points and edges to a mesh.]]
#include "itkMesh.h"
#include "itkLineCell.h"


const unsigned int Dimension = 3;
[[Mesh Decimation]]
typedef itk::Mesh< float, Dimension >  MeshType;
MeshType::Pointer CreatePointOnlyMesh();
void CreateMeshWithEdges();


int main(int, char *[])
[[Mesh Subdivision]]
{
//CreatePointOnlyMesh();
CreateMeshWithEdges();
  return 0;
}
 
 
MeshType::Pointer CreatePointOnlyMesh()
{
MeshType::Pointer  mesh = MeshType::New();
 
//create points
MeshType::PointType p0,p1,p2,p3;
p0[0]= -1.0; p0[1]= -1.0; p0[2]= 0.0; // first  point ( -1, -1, 0 )
p1[0]=  1.0; p1[1]= -1.0; p1[2]= 0.0; // second point (  1, -1, 0 )
p2[0]=  1.0; p2[1]=  1.0; p2[2]= 0.0; // third  point (  1,  1, 0 )
p3[0]=  1.0; p3[1]=  1.0; p3[2]= 1.0; // third  point (  1,  1, 1 )
 
mesh->SetPoint( 0, p0 );
mesh->SetPoint( 1, p1 );
mesh->SetPoint( 2, p2 );
mesh->SetPoint( 3, p3 );
 
std::cout << "Points = " << mesh->GetNumberOfPoints() << std::endl;
 
//access points
typedef MeshType::PointsContainer::Iterator    PointsIterator;
 
PointsIterator  pointIterator = mesh->GetPoints()->Begin(); 
 
PointsIterator end = mesh->GetPoints()->End();
while( pointIterator != end )
{
MeshType::PointType p = pointIterator.Value();  // access the point
std::cout << p << std::endl;                    // print the point
++pointIterator;                                // advance to next point
}
 
return mesh;
}
 
void CreateMeshWithEdges()
{
MeshType::Pointer mesh = CreatePointOnlyMesh();
typedef MeshType::CellType::CellAutoPointer        CellAutoPointer;
typedef itk::LineCell< MeshType::CellType >        LineType;
//create a link to the previous point in the column (below the current point)
CellAutoPointer colline;
colline.TakeOwnership(  new LineType  );
//unsigned int pointId0 = 0;
//unsigned int pointId1 = 1;
unsigned int pointId0 = 2;
unsigned int pointId1 = 3;
colline->SetPointId(0, pointId0); // line between points 0 and 1
colline->SetPointId(1, pointId1);
//std::cout << "Linked point: " << MeshIndex << " and " << MeshIndex - 1 << std::endl;
mesh->SetCell( 0, colline );
 
typedef MeshType::CellsContainer::Iterator  CellIterator;
CellIterator  cellIterator = mesh->GetCells()->Begin();
CellIterator  CellsEnd          = mesh->GetCells()->End();
while( cellIterator != CellsEnd )
{
MeshType::CellType * cellptr = cellIterator.Value();
LineType * line = dynamic_cast<LineType *>( cellptr );
/*
typePointIdConstIterator PointIdsBegin (void) const
PointIdIterator PointIdsBegin (void)
PointIdConstIterator PointIdsEnd (void) const
PointIdIterator PointIdsEnd (void)
*/
long unsigned int* linePoint0 = line->PointIdsBegin();
//long unsigned int* linePoint1 = line->PointIdsEnd();
long unsigned int* linePoint1 = linePoint0+1;
std::cout << "line first point id: " << *linePoint0 << std::endl;
std::cout << "line second point id: " << *linePoint1 << std::endl;
++cellIterator;
}
}
 
</source>

Latest revision as of 01:11, 16 September 2009

For N-D meshes, use itkMesh. For 2D surfaces embedded in 3D, use itkQuadEdgeMesh (in the Review directory).

Add points and edges to a mesh.

Mesh Decimation

Mesh Subdivision