[vtkusers] how to use PolyData::GetPolys()?

Dominik Szczerba domi at vision.ee.ethz.ch
Tue Oct 10 16:06:08 EDT 2006


John,

Thanks a lot for the hints, but after your previous hints I was not 
copying anything already. There were two things:

1) To use e.g.
	 const double* p1 = 
(double*)(polydata->GetPoints()->GetData())->GetVoidPointer(3*id1);

instead
	 const double* p1 = 
vtkDoubleArray::SafeDownCast(polydata->GetPoints()->GetData())->GetPointer(3*id1);

Somehow this works twice faster for me, maybe tricks g++ does to -Ox 
switches

2) to control refresh rate. The RenderInteractor timers segfaults for me 
so I cannot use elegant idle calls. I took over the main loop calling 
Render() by hand. When reduced to 40 miliseconds (timing up things 
myself) factor another 2 is back.

Still, there is some slight decrease in performance compared to the 
other code but I can live with it for now.

Thanks a lot for your help,
Looking forward to help you too some day,
Dominik

John Biddiscombe wrote:
> Dominik
> 
> OK, OK. Don't give up yet. If the previous method wasn't fast enough, 
> then you need to avoid copying any ID's or points from the cell array 
> and work directly from the Id's and points
> 
> fisr get a pointer to the raw points float data using float *rawdata = 
> vtkFloatArray::SafeDownCast(points->GetData())->GetPointer(0);
> or double according to tase...
> 
> then get a pointer to the cell array
>   vtkCellArray *cells = input->GetPolys();
> now walk the cell array using something like this
> 
>  vtkIdType *ptIds = cells->GetPointer();
>  for (int i=0; i<numCells; i++) {
>    vtkIdType nverts = *ptIds++;
>    while (nverts>0) {
>      vtkIdType Id = *ptIds++;
>       you can now use the ID to index directly the points and do 
> whatever you need
>        we haven't copied any Id's or points so it doesn't get much 
> faster then this
>      }
>      nverts--;
>    }
>  }
> 
> Now come on - we must be getting there now? I should have suggested this 
> first time, but it's better to build up a bit of suspense :)
> 
> JB
> 
>> John, you have been most helpful, I could take over from your points.
>> However, I do not observe any significant speed gain compared to the 
>> "normal" GetCell style...?
>> Thanks a lot!
>> Dominik
>>
>> John Biddiscombe wrote:
>>> Dominik
>>>
>>> Does this code snippet help you.(snippet from an old filter of mine, 
>>> ignore the preamble etc
>>>
>>>    vtkPolyData  *input    = (vtkPolyData *)this->GetInput();
>>>    vtkPolyData  *output   = (vtkPolyData *)this->GetOutput();
>>>    vtkPolyData  *failOut  = this->GetFailedData();
>>>    vtkPoints    *in_Pts   = input->GetPoints();
>>>    vtkCellArray *in_Polys = input->GetPolys();
>>>    if (input->GetNumberOfPoints()==0) return;
>>>    int nc = in_Polys->GetNumberOfCells();
>>>    //
>>>    vtkCellArray *out_Polys    = vtkCellArray::New();
>>>    vtkCellArray *bad_Polys    = vtkCellArray::New();
>>>    //
>>>    // Should have same polys out as in if no bad ones are found
>>>    //
>>>    out_Polys->Allocate(nc,nc);
>>>    bad_Polys->Allocate(nc,nc);
>>>    //
>>>    // Walk Polygons and test them all
>>>    //
>>>    vtkIdType npoints, *pt_IDs, polyID=0;
>>>    int m_c_s = input->GetMaxCellSize();
>>>    doublevector3 *points = new doublevector3[m_c_s];
>>>    double fnormal[3];
>>>    for (in_Polys->InitTraversal(); 
>>> in_Polys->GetNextCell(npoints,pt_IDs); polyID++) {
>>>        // make local copy of cell points
>>>        for (int i=0; i<npoints; i++) 
>>> in_Pts->GetPoint(pt_IDs[i],&points[i].x);
>>> ....
>>>
>>> now replace the line
>>>        for (int i=0; i<npoints; i++) 
>>> in_Pts->GetPoint(pt_IDs[i],&points[i].x);
>>> with something more like float *rawdata = (float 
>>> *)in_Pts->GetData()->GetVoidPointer()
>>> and then
>>>        for (int i=0; i<npoints; i++) points[i] = rawdata[i] - times 3 
>>> for x,y,z
>>>
>>> any use?
>>>
>>> JB
>>>
>>>
>>>
>>>
>>>> I still dont get how the GetNextCell works but I cann access the raw 
>>>> int connectivity array - I guess PolyData::GetPolys::Get*Cell 
>>>> methods base on it. Unfortunately it doesnt work any faster, against 
>>>> as promised in the docu. I get ~ 5x better performance using an ugly 
>>>> glut code on the same dataset. Missed anything?
>>>> Thanks,
>>>> Dominik
>>>>
>>>> Dominik Szczerba wrote:
>>>>> Hi,
>>>>> I am retrieving cells in a polydata using GetCell and it works, 
>>>>> only very slow. I read I can use GetPolys to get faster, but there 
>>>>> are no examples and hitting blind just leads me nowhere. I guess 
>>>>> PolyData::GetPolys::GetCell(id, &N, &ids) should fill ids with 
>>>>> connectivity array of a cell id, and set N to number of points in 
>>>>> the cell. Even though it compiles it doenst work. Could someone 
>>>>> provide me with one line example?
>>>>> Regards,
>>>>> Dominik
>>>>
>>>
>>>
>>
> 
> 

-- 
Dominik Szczerba, Ph.D.
Computer Vision Lab, ETH
http://www.vision.ee.ethz.ch/~domi



More information about the vtkusers mailing list