[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