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

John Biddiscombe biddisco at cscs.ch
Tue Oct 10 15:33:06 EDT 2006


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
>>>
>>
>>
>


-- 
John Biddiscombe,                            email:biddisco @ cscs.ch
http://www.cscs.ch/about/BJohn.php
CSCS, Swiss National Supercomputing Centre  | Tel:  +41 (91) 610.82.07
Via Cantonale, 6928 Manno, Switzerland      | Fax:  +41 (91) 610.82.82





More information about the vtkusers mailing list