[vtkusers] How to create triangle strips?
Jim Peterson
jimcp at cox.net
Thu Nov 25 11:05:27 EST 2010
> //set ids
> for (int i = 0; i < nx - 1; i++)
> {
> *cells.InsertNextCell(ny * 2);*
> for (int j = 0; j < ny; j++)
> {
> *cells.InsertCellPoint(i + j * nx);*
> *cells.InsertCellPoint(i + j * nx + 1);*
> }
> }
I suggest you add a comment with the expected result and comment the
lines, Unless I am mistaken, you are created sets of overlapping cells,
at a minimum, I would expect the numbering to be i*nx instead of j*nx.
that would result in sequential cell definitions.
Hope that helps,
Jim
Hugo,
What kind of topology are you expecting this loop to create?
Hugo Valdebenito wrote:
> Hi David, thanks for your useful help!
>
> I tried with you suddestion, but didn't get it work :(. please, can
> you check my code?
>
> public void* GenerateTest*(int nx, int ny)
> {
>
> vtkPoints points = vtkPoints.New();
> vtkCellArray cells = new vtkCellArray();
>
> //vtkTriangleStrip triangleStrip;
>
> int index = 0;
> double z,zmax = 50.0;
> points.SetNumberOfPoints(nx * ny);
> for (int j = 0; j < ny; j++)
> {
> for (int i = 0; i < nx; i++)
> {
> z = zmax * Math.Sin(4 * 3.1 * i / (float)nx) + 4 * j /
> (float)(ny);
> //insert point and increment index
> points.SetPoint(index++,(double)i, (double)j, (double)z);
> }
> }
> //set ids
> for (int i = 0; i < nx - 1; i++)
> {
> *cells.InsertNextCell(ny * 2);*
> for (int j = 0; j < ny; j++)
> {
> *cells.InsertCellPoint(i + j * nx);*
> *cells.InsertCellPoint(i + j * nx + 1);*
> }
> }
> vtkPolyData polydata = new vtkPolyData();
> polydata.SetPoints(points);
> polydata.SetStrips(cells);
>
> // Create an actor and mapper
> vtkDataSetMapper mapper = new vtkDataSetMapper();
> mapper.SetInput(polydata);
> vtkActor Actor = new vtkActor();
>
> Actor.SetMapper(mapper);
> Actor.GetProperty().SetRepresentationToWireframe();
> //Add the actors to the scene
> _renderer.AddActor(Actor);
>
>
> Hugo.
>
> 2010/11/23 David Gobbi <david.gobbi at gmail.com
> <mailto:david.gobbi at gmail.com>>
>
> Hi Hugo,
>
> Go with my method. Remove the vtkTriangleStrip class from your
> code, it isn't needed and it just makes the code less efficient
> (and IMHO more confusing). The vtkCellArray has many
> InsertNextCell methods, and the one that takes a vtkCell object is
> the least efficient of all of them. For you, I think the best way
> to add cells is this:
>
> cells.InsertNextCell(number_of_ids_in_strip)
> cells.InsertCellPoint(first_id_in_strip)
> cells.InsertCellPoint(second_id_in_srip)
> (repeat InsertCellPoint for all IDs)
>
> Repeat all of the above for each strip that you want to add, then
> call SetStrips() to add the whole cell array to the
> polydata. Look at the example code that I linked to in my
> previous email for more info.
>
> David
>
>
> On Tue, Nov 23, 2010 at 4:30 AM, Hugo Valdebenito <hugo at maptek.cl
> <mailto:hugo at maptek.cl>> wrote:
>
> Hi David.
>
> Thanks for you help, I'm trying to undestand, I have some
> doubts yet, Which is the difference between both methods?
> Wich is better?.
>
> Hugo.
>
>
> 2010/11/22 David Gobbi <david.gobbi at gmail.com
> <mailto:david.gobbi at gmail.com>>
>
> Hi Hugo,
>
> Your code is a mix of the method that I suggested and the
> method that David Doria suggested. The SetStrips() method
> is a low-level method for building a vtkPolyData (as per
> my suggestion). The InsertNextCell() method is a
> high-level method for building a vtkDataSet (as per David
> Doria's suggestion). You have to use one method or the
> other, not both. I apologize for the confusion.
>
> David
>
> On Mon, Nov 22, 2010 at 11:10 AM, Hugo Valdebenito
> <hugo at maptek.cl <mailto:hugo at maptek.cl>> wrote:
>
> Hi David.
>
> It works with one strip, but that doesn't work with 2
> o more strips. that is my implementation (sorry, is
> C#, I translated the c++ example)
>
> public void GenerateSurface(int nx, int ny)
> {
>
> vtkPoints points = vtkPoints.New();
> vtkCellArray cells = new vtkCellArray();
> vtkTriangleStrip triangleStrip;
>
>
> double z,zmax = 50.0;
> points.SetNumberOfPoints(nx * ny);
> //se points
> int index = 0;
> for (int j = 0; j < ny; j++)
> {
> for (int i = 0; i < nx; i++)
> {
> z = zmax * Math.Sin(4 * 3.1 * i /
> (float)nx) + 4 * j / (float)(ny);
> //insert point and increment index
> *points.SetPoint(index++,(double)i,
> (double)j, (double)z);*
>
>
> }
> }
> //set ids
> for (int i = 0; i < nx - 1; i++)
> {
> index = 0;
> triangleStrip = new vtkTriangleStrip();
>
> triangleStrip.GetPointIds().SetNumberOfIds(ny*2);
>
> for (int j = 0; j < ny; j++)
> {
>
> triangleStrip.GetPointIds().SetId(index++, i + j * nx);
>
> triangleStrip.GetPointIds().SetId(index++, i + j * nx
> + 1);
> }
> *cells.InsertNextCell(triangleStrip);*
> }
> vtkPolyData polydata = new vtkPolyData();
> polydata.SetPoints(points);
> *polydata.SetStrips(cells);*
>
> // Create an actor and mapper
> vtkDataSetMapper mapper = new
> vtkDataSetMapper();
> mapper.SetInput(polydata);
> vtkActor Actor = new vtkActor();
>
> Actor.SetMapper(mapper);
>
> Actor.GetProperty().SetRepresentationToWireframe();
> //Add the actors to the scene
> _renderer.AddActor(Actor);
> }
>
>
> Hugo
>
>
>
> 2010/11/22 David Gobbi <david.gobbi at gmail.com
> <mailto:david.gobbi at gmail.com>>
>
> Hi Hugo,
>
> The vtkPolyData stores the strips in an array
> called "Strips", that is
> how it knows what cells are strips. And all
> vtkDataSet objects have a
> GetCellType(i) method that VTK can use to check
> the type of cell "i".
> I have some code here that generates several
> shapes with triangle
> strips:
> https://github.com/dgobbi/ToolCursor/blob/master/vtkGeometricCursorShapes.cxx
>
> David
>
>
> On Mon, Nov 22, 2010 at 5:55 AM, Hugo Valdebenito
> <hugo at maptek.cl <mailto:hugo at maptek.cl>> wrote:
> >
> > You should to see the triangles, maybe it's
> wrong. with 4 ids you define 2
> > triagles, with 5 --> 3 and so on (that structure
> saves memory). How does you
> > said to vtk that you are using Strips? I don't
> know how to define that on
> > VTK.
> >
> >
> > Thanks!
> >
> >
> >
> > 2010/11/19 David Doria <daviddoria at gmail.com
> <mailto:daviddoria at gmail.com>>
> >>
> >> On Fri, Nov 19, 2010 at 3:22 PM, Hugo
> Valdebenito <hugo at maptek.cl
> <mailto:hugo at maptek.cl>> wrote:
> >> > Thanks david!!
> >> >
> >> > vtkCellArray object is defined, but never
> used....
> >> >
> >> > Anyone can suggest a fix?, I'm beginner on VTK
> >> > Hugo
> >>
> >> Try it now. It doesn't show the line through
> the middle of the square
> >> (the center edge of the triangles), but maybe
> that is expected with a
> >> triangle strip?
> >>
> >>
> >>
> http://www.vtk.org/Wiki/VTK/Examples/Cxx/Broken/GeometricObjects/TriangleStrip
> >>
> >> David
>
>
>
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>
More information about the vtkusers
mailing list