[vtkusers] triangulating a cylinder

debbie larson debbielarson_9 at hotmail.com
Wed Dec 6 23:06:22 EST 2006


Hi,

Thanks much for all the help. Yes this and Burlen's pointer should solve my 
problem.

deb
>From: "Obada Mahdi" <omahdi at gmx.de>
>To: "debbie larson" <debbielarson_9 at hotmail.com>
>CC: vtkusers at vtk.org
>Subject: Re: [vtkusers] triangulating a cylinder
>Date: Thu, 7 Dec 2006 04:47:25 +0100
>
>Hi,
>
>just some additional hints:
>
>On 12/6/06, debbie larson <debbielarson_9 at hotmail.com> wrote:
>>I would like to build a vtkPolyData (triangular) representation of a
>>cylinder. The points that define the cylinder sit on a number N of
>>perpendicular circles (they are equally spaced).
>
>There is a polydata source, vtkCylinderSource, that will generate a
>polygonal representation of a cylinder (including normals and texture
>coordinates), given its radius, height and resolution (number of
>facets), have a look at
>
>http://www.vtk.org/doc/nightly/html/classvtkCylinderSource.html
>
>It uses quads instead of triangles for the facets, but you could use
>vtkTriangleFilter to triangulate its output.  There is also
>vtkTubeFilter
>
>http://www.vtk.org/doc/nightly/html/classvtkTubeFilter.html
>
>which you could try if you need the polygonal representation of your
>cylinder to consist of several "rings".  According to the
>documentation, it produces triangle strips, which can also be split
>using vtkTriangleFilter (if separate triangles are required).
>
>>I dont know how to specify the vtkCellArray for the triangles so that they
>>match the points.
>
>I am not sure whether that is your question, but the correlation
>between a cell array and corresponding points is provided implicitly
>by grouping them in a data set like vtkPolyData.  Cell definitions in
>a cell array only contain point IDs (i.e., simple integers), there is
>no explicit link to a particuar set of points.  The "rules" for how to
>interpret these IDs and correlate them to actual coordinates are just
>part of the concept of e.g. vtkPolyData.
>
>>Here it is how I compute the points in the cylinder
>>
>>-------------------------------------------------------
>>
>>float pts[number_of_points*N][3];
>>for (int k=0;k<N;k++)
>>         {
>>           for (int j=0;j<number_of_points;j++)
>>             {
>>
>>pts[k*number_of_points+j][0]=radius*cos(2*M_PI*j/number_of_points);
>>pts[k*number_of_points+j][1]=radius*sin(2*M_PI*j/number_of_points);
>>               pts[k*number_of_points+j][2]=k*distance_between_circles;
>>              }
>>          }
>>vtkFloatArray* coords=vtkFloatArray::New();
>>   coords->SetNumberOfComponents(3);
>>   coords->SetNumberOfTuples(number_of_points*N);
>>
>>   for (int i=0;i<number_of_points*N;i++)
>>     {
>>       coords->SetTuple(i,innerpts[i]);
>>     }
>>   vtkPoints points=vtkPoints::New();
>>   points->SetData(coords);
>>   ---------------------------------------------------------------------
>>I would like to do something like
>>
>>vtkCellArray* tri=vtkCellArray::New();
>>
>>and assign the points above to tri. How to do it?
>
>To insert triangles one at a time, ring for ring, one could probably
>do something like
>----
>  for ( int k = 0; k < N-1; k++ ) {  // only run up to N-2
>    // Point IDs of first points in current ring and next ring.
>    const int curOffset = k*number_of_points;
>    const int nextOffset = curOffset + number_of_points;
>
>    // Triangulate a single quad like this:
>    // ...[j]---[j+1]...  ring k+1 (indices start at nextOffset)
>    //      |\  |
>    //      | \ |
>    //      |  \|
>    // ...[j]---[j+1]...  ring k (indices start at curOffset)
>    for ( int j = 0; j < number_of_points-1; j++ ) {
>      vtkIdType tri1[3] = { curOffset+j, curOffset+j+1, nextOffset+j };
>      vtkIdType tri2[3] = { nextOffset+j, curOffset+j+1, curOffset+j+1 };
>
>      tri->InsertNextCell(3, tri1);
>      tri->InsertNextCell(3, tri2);
>    }
>  }
>
>  // Use `points' and `tri' to populate a vtkPolyData
>  vtkPolyData* cylinderPolys = vtkPolyData::New();
>  cylinderPolys->SetPoints(points);
>  cylinderPolys->SetPolys(tri);
>----
>
>Note that this already makes assumptions about the layout of the `pts'
>array.  I am not sure whether the code above is correct, but it shows
>the general idea :-) Creating triangle strips would be even simpler.
>
>You might also want to have a look at the implementations of
>vtkCylinderSource and vtkTubeFilter at
>Graphics/vtkCylinderSource.cxx
>Graphics/vtkTubeFilter.cxx
>to see how it is done there.
>
>
>HTH,
>
>Obada

_________________________________________________________________
Share your latest news with your friends with the Windows Live Spaces 
friends module. 
http://clk.atdmt.com/MSN/go/msnnkwsp0070000001msn/direct/01/?href=http://spaces.live.com/spacesapi.aspx?wx_action=create&wx_url=/friends.aspx&mk




More information about the vtkusers mailing list