[vtkusers] vtkPolyData::InsertNextLinkedPoint corrupted heap

NsPx nspx.roronoa at gmail.com
Fri Sep 28 10:21:48 EDT 2012


I'm answering my own post to give more details. Here is a C++ example 
wich reproduces my heap corruption problem.
Thanks by advance.

/****/

#include "vtkPolyData.H"
#include "vtkSmartPointer.H"
#include "vtkSphereSource.H"
#include "vtkIdType.H"
#include "vtkIdList.H"

int main(int argc, char *argv[])
{
     vtkSmartPointer<vtkSphereSource> source = 
vtkSmartPointer<vtkSphereSource>::New();
     source->Update();

     vtkSmartPointer<vtkPolyData> Mesh = 
vtkSmartPointer<vtkPolyData>::New();
     Mesh->DeepCopy( source->GetOutput());
     Mesh->BuildLinks();

     // cell 0 and cell 1 share the same edge composed by the couple of 
points (0, 8)
     // we create a new point in the middle of the edge
     // then instead of creating four new cells we update cell 0 and 
cell 1 and create only two new cells

     vtkIdType cell0pt0, cell0pt1, cell0pt2;
     vtkIdType cell1pt0, cell1pt1, cell1pt2;

     vtkSmartPointer<vtkIdList> ids_list = 
vtkSmartPointer<vtkIdList>::New();
     Mesh->GetCellPoints( 0, ids_list);

     cell0pt0 = ids_list->GetId(1);
     cell0pt1 = ids_list->GetId(2);
     cell0pt2 = ids_list->GetId(0);

     Mesh->GetCellPoints( 1, ids_list);

     cell1pt0 = ids_list->GetId(0);
     cell1pt2 = ids_list->GetId(1);
     cell1pt1 = ids_list->GetId(2);

     double point0[3], point1[3], newPoint[3];

     Mesh->GetPoints()->GetPoint( cell0pt0, point0);
     Mesh->GetPoints()->GetPoint( cell0pt1, point1);

     for(int i=0; i<3; i++)
         newPoint[i] = 0.5*( point0[i]+ point1[i]);

     // for each cell we create two new cell from the middle of the edge

     // newPoint will be used by four cells
     vtkIdType newId = Mesh->InsertNextLinkedPoint(newPoint,4);

     // we update the current cell 0 by replacing cell0pt1 with the new 
point
     Mesh->ReplaceCellPoint( 0, cell0pt1, newId);
     Mesh->RemoveReferenceToCell( cell0pt1, 0);
     Mesh->AddReferenceToCell( newId, 0);

     // we add a new cell
     vtkIdType tri1[3];
     tri1[0] = cell0pt2;
     tri1[1] = newId;
     tri1[2] = cell0pt1;

     vtkIdType new_cell0 = Mesh->InsertNextLinkedCell(VTK_TRIANGLE,3,tri1);

     // we update the current cell 1 by replacing cell1pt1 with the new 
point
     Mesh->ReplaceCellPoint( 1, cell1pt1, newId);
     Mesh->RemoveReferenceToCell( cell1pt1, 1);
     Mesh->AddReferenceToCell( newId, 1);

     // we add a new cell
     vtkIdType tri2[3];
     tri2[0] = cell1pt1;
     tri2[1] = newId;
     tri2[2] = cell1pt2;

     // this line throw a heap corruption alert in debug
     vtkIdType new_cell2 = Mesh->InsertNextLinkedCell(VTK_TRIANGLE,3,tri2);
}

Le 28/09/2012 11:55, NsPx a écrit :
> Hi all,
>
> Can someone explain me how vtkPolyData::InsertNextLinkedPoint works ?
>
> I get heap corruption when trying to split triangles by adding new 
> points at this edge.
>
> Thanks by advance.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120928/fb37073b/attachment.htm>


More information about the vtkusers mailing list