[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