简体   繁体   中英

CGAL - wrong vertices index retrieved after Delaunay Triangulation in 3d

I'm using latest CGAL(4.5) with VS2012. After Delaunay triangulation, I output the whole tetrahedron mesh to "testFile1" with CGAL Delaunay triangulation's default stream output. The data in "testFile1" is right.(I visualised the mesh and it is OK)

Then I iterate through all the tetrahedrons and get the vertices' index and output them to "testFile2", but the indices is totally different with the indices in "testFile1". I visualised the mesh and it is totally a mess.

I also output the vertex position of each tetrahedron in my own iterations, they are the same with testFile1(the coord of the 1st vertex of the 1st tetrahedron is the same, and so on). So the tetrahedron in testFile1 and testFile2 is the same, the problem is in getting the vertex indices.

my code:

std::vector<std::pair<Point,int>> V;
V.reserve(pointCount);
//push selected point into V with index info
for(int i=0;i<pointCount;i++)
{
    int id = randomNumbers[i];
    V.push_back(std::make_pair(Point(
        points[id]._p[0], 
        points[id]._p[1], 
        points[id]._p[2]), i));
}

Delaunay T;
T.insert(V.begin(), V.end());

//output vertices position and vertices index and cell neighbor index to testFile1
//data in testFile1 is right
std::ofstream oFileT("testFile1",std::ios::out);
oFileT << T;        



//output indices to testFile2 by my own iteration
std::ofstream oFileT("testFile2",std::ios::out);
int index = 0;
Delaunay::Finite_cells_iterator it;
for(it = T.finite_cells_begin(); it!=T.finite_cells_end(); ++it)
{
    for(int i=0;i<4;i++)
    {
        //here the coord is right 
        float testCoord = T.tetrahedron(it).vertex(i).x();

        //but the index here is totally different with testFile1
        int info = 0;
        if(!T.is_infinite(it->vertex(i)))
            info = it->vertex(i)->info();

        oFileT<<info<<" ";  //output vertices index to testFile2
    }
    oFileT<<std::endl;
    index++;
}

Any ideas?

UPDATE:

The weird thing is, for example:

In testFile1: tet index: 702 25 35 153

And In my own iteration, it->vertex(i)->point().x() get 702\\25\\35\\153's x coord but it->vertex(i)->info() get 1601\\1352.....

The vertices are sorted along an hilbert curve to speed up the construction of the triangulation. If you want to have the order of iteration matching the info() field, simply iterate over the vertices once and set the info()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM