[ITK] Get the list of Points, Edges and Cells of a Mesh
Oliveira, Rodolfo
r.oliveira16 at imperial.ac.uk
Tue Sep 13 05:54:19 EDT 2016
Hi Matt,
It did helped a lot!
I modified the example to display what's been written to file in terms of what I need but I'm struggling to access the edges of a particular face. For now all I can do is to iterate over the points and cell's ids. There are some examples to write data to cells but I either don't find it that useful for my case or completely understood it.
Please find my code below:
#include "itkQuadEdgeMesh.h"
#include "itkMeshFileWriter.h"
#include "itkMeshFileReader.h"
int main(int argc, char* argv[])
{
if (argc != 2)
{
std::cerr << "Usage: " << std::endl;
std::cerr << argv[0];
std::cerr << " <OutputFileName>";
std::cerr << std::endl;
return EXIT_FAILURE;
}
const char * outputFileName = argv[1];
//
// Definitions
//
const unsigned int Dimension = 3;
typedef double CoordType;
typedef itk::QuadEdgeMesh< CoordType, Dimension > MeshType;
MeshType::Pointer mesh = MeshType::New();
typedef MeshType::PointsContainer PointsContainer;
typedef MeshType::PointsContainerPointer PointsContainerPointer;
//
// Create points
//
PointsContainerPointer points = PointsContainer::New();
points->Reserve(9);
typedef MeshType::PointType PointType;
PointType p;
p[2] = 0.;
typedef MeshType::PointIdentifier PointIdentifier;
PointIdentifier k = 0;
for (int i = 0; i < 3; i++)
{
p[0] = static_cast< CoordType >(i);
for (int j = 0; j < 3; j++)
{
p[1] = static_cast< CoordType >(j);
points->SetElement(k, p);
k++;
}
}
mesh->SetPoints(points);
//
// Create faces
//
k = 0;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
mesh->AddFaceTriangle(k, k + 1, k + 4);
mesh->AddFaceTriangle(k, k + 4, k + 3);
k++;
}
k++;
}
//
// Write mesh to file
//
typedef itk::MeshFileWriter< MeshType > WriterType;
WriterType::Pointer writer = WriterType::New();
writer->SetFileName(outputFileName);
writer->SetInput(mesh);
try
{
writer->Update();
}
catch (itk::ExceptionObject & error)
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
//
// Read mesh to file
//
typedef itk::MeshFileReader< MeshType > ReaderType;
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName(outputFileName);
try
{
reader->Update();
}
catch (itk::ExceptionObject & error)
{
std::cerr << "Error: " << error << std::endl;
return EXIT_FAILURE;
}
mesh = reader->GetOutput();
//
// Print data
//
typedef MeshType::PointsContainer::ConstIterator PointIterator;
PointIterator pointIterator = mesh->GetPoints()->Begin();
PointIterator pointEnd = mesh->GetPoints()->End();
MeshType::PointIdentifier pid;
while (pointIterator != pointEnd)
{
p = pointIterator.Value();
pid = pointIterator.Index();
std::cout << pid << ": "
<< p[0] << " "
<< p[1] << " "
<< p[2] << std::endl;
++pointIterator;
}
//
// Print edges
//
typedef MeshType::CellsContainer::ConstIterator CellIterator;
CellIterator cellIterator = mesh->GetCells()->Begin();
CellIterator cellEnd = mesh->GetCells()->End();
MeshType::CellType *c;
MeshType::CellIdentifier cid;
while (cellIterator != cellEnd)
{
c = cellIterator.Value();
cid = cellIterator.Index();
std::cout << cid << ": "
// The face's edge list?
<< std::endl;
++cellIterator;
}
return EXIT_SUCCESS;
}
Thanks again!
Rodolfo
________________________________
From: Matt McCormick <matt.mccormick at kitware.com>
Sent: 07 September 2016 21:30:18
To: Oliveira, Rodolfo
Cc: Community at itk.org
Subject: Re: [ITK] Get the list of Points, Edges and Cells of a Mesh
Hi Rodolfo,
Here is an example of how to manually create a mesh:
https://itk.org/ITKExamples/src/Core/QuadEdgeMesh/CreateTriangularQuadEdgeMesh/Documentation.html
HTH,
Matt
On Wed, Sep 7, 2016 at 12:36 PM, Oliveira, Rodolfo
<r.oliveira16 at imperial.ac.uk> wrote:
> Hi,
>
>
> I need to get the list of points, edges and cells of an itk mesh to file. I
> have to write the points, the edges as a reference of two points' indexes
> and the faces as three edges' indexes.
>
>
> So far I only managed to get the points from a mesh, using a point iterator
> and writing its value and indexes. I still haven't figure it out how to get
> the linking indexes of the edges and faces.
>
>
> For illustration purposes, say I have a mesh containing a single triangle,
> defined this:
>
>
> 0,1 - 2 - 1,1
>
> | /
>
> | /
>
> | 1 /
>
> 1 3
>
> | /
>
> | /
>
> | /
>
> 0,0
>
>
> The structure would be like this:
>
> Points:
> 1: 0,0
> 2: 0,1
> 3: 1,1
>
> Edges:
> 1: 1 2 (Point 1 to Point 2)
> 2: 2 3
> 3: 3 1
>
> Faces:
> 1: 1 2 3 (Edge 1, to Edge 2 and Edge 3)
>
> This is a rather simplistic example, but there is no difference for the case
> of more than one triangle. But they might share some of the same indexes
> when neighbours.
>
> Any help would be much appreciated!
>
>
> Thanks,
>
>
> Rodolfo
>
>
> _______________________________________________
> Community mailing list
> Community at itk.org
> http://public.kitware.com/mailman/listinfo/community
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/community/attachments/20160913/7f85a663/attachment.html>
More information about the Community
mailing list