[vtkusers] How to construct polygon?

kenichiro yoshimi rccm.kyoshimi at gmail.com
Mon Apr 17 03:56:22 EDT 2017


Hi,

For the current polygon vtkTriangleFilter fails to tessellate due to its
nonplanarity.

If my suggestion to use vtkDelaunay3D ends up with the unexpected results,
it may be necessary to use vtkStructuredGrid class for your purpose. I have
an attached sample.

Thanks,
yoshimi

2017-04-17 13:28 GMT+09:00 rakesh patil <prakeshofficial at gmail.com>:

> Hi,
>
> I thought that vtkTriangleFilter does the tessellation of polygon by
> triangulating. Correct me if I am wrong. Let me try your suggestion and
> come back.
>
> Thanks
>
> On Mon, Apr 17, 2017 at 7:34 AM, kenichiro yoshimi <
> rccm.kyoshimi at gmail.com> wrote:
>
>> Hi,
>>
>> It looks like the issue of rendering concave polygons by OpenGL included
>> in the past mailing list, and it is concluded that OpenGL doesn't render
>> concave polygons properly and needs tessellation:
>> http://public.kitware.com/pipermail/vtkusers/2010-May/059784.html
>> http://vtk.1045678.n5.nabble.com/problems-rendering-concave-
>> polygon-td5007789.html
>> (I'm sorry I don't know the details of this problem.)
>>
>> I suggest using vtkDelaunay3D for tessellating and then using
>> vtkGeometryFilter that extracts the external faces.
>>
>> Thanks,
>> yoshimi
>>
>> 2017-04-17 3:30 GMT+09:00 rakesh patil <prakeshofficial at gmail.com>:
>>
>>> Hi,
>>>
>>> Well, I would like to know how polygon loop being non-planar leads to
>>> such output. Because, the image shown in expectedOutput is also built of
>>> similar polygon loop. Its just that for few curved surfaces are rendered
>>> properly and few don't. I just want to know why is there such inconsistent
>>> behavior and how do I overcome this?
>>>
>>> Thanks
>>>
>>> On Sat, Apr 15, 2017 at 10:56 AM, kenichiro yoshimi <
>>> rccm.kyoshimi at gmail.com> wrote:
>>>
>>>> Hi,
>>>>
>>>> Your polygon loop is non-planar.
>>>>
>>>>>>>> Howerver, the triangulate method used by vtkPolygon assumes that
>>>> polygon points lie in a plane. I recommend to use vtkCylinderSource or
>>>> vtkStructuredGrid to represent the side of surface of a cylinder.
>>>>
>>>> Thanks,
>>>> yoshimi
>>>>
>>>> 2017-04-14 0:38 GMT+09:00 Rakesh Patil <rakesh.p at tataelxsi.co.in>:
>>>>
>>>>> Hi,
>>>>>
>>>>>
>>>>> This question seems to be simple, but I am not able to get any output
>>>>> for this. I am not able to understand what is happening in this case:
>>>>>
>>>>>
>>>>> vtkSmartPointer<vtkPoints> tpoints = vtkSmartPointer<vtkPoints>::New();
>>>>>
>>>>> vtkSmartPointer<vtkPolygon> poly = vtkSmartPointer<vtkPolygon>::New();
>>>>>
>>>>> vtkSmartPointer<vtkCellArray> carr = vtkSmartPointer<vtkCellArray>::New();
>>>>>
>>>>> vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
>>>>>
>>>>>
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( 4.39116, -2.39117, 4.5));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( 4.39116, -2.39117, 3));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( 4.39116, -2.39117, 1.5));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( 4.39116, -2.39117, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( 4.08748, -2.87967, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( 3.05391, -3.95899, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( 1.74755, -4.68466, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( 0.28509, -4.99187, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -1.20284, -4.85316, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -2.58332, -4.28094, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -3.73305, -3.32631, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -4.54931, -2.07456, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -4.95919, -0.637487, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -4.92609, 0.856528, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -4.45295, 2.27403, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -3.58205, 3.4884, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -2.39117, 4.39116, 0));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -2.39117, 4.39116, 1.5));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -2.39117, 4.39116, 3));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -2.39117, 4.39116, 4.5));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -2.39117, 4.39116, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -3.58205, 3.4884, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -4.45295, 2.27403, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint( -4.92609, 0.856528, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint(-4.95919, -0.637487, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint(-4.54931, -2.07456, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint(-3.73305, -3.32631, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint(-2.58332, -4.28094, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint(-1.20284, -4.85316, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint(0.28509, -4.99187, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint(1.74755, -4.68466, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint(3.05391, -3.95899, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint(4.08748, -2.87967, 6));
>>>>>
>>>>> poly->GetPointIds()->InsertNextId(tpoints->InsertNextPoint(4.39116, -2.39117, 6));
>>>>>
>>>>> carr->InsertNextCell(poly);
>>>>>
>>>>>
>>>>>     polyData->SetPoints(tpoints);
>>>>>
>>>>>     polyData->SetPolys(carr);
>>>>>
>>>>>
>>>>>     vtkSmartPointer<vtkTriangleFilter> tfilter = vtkSmartPointer<vtkTriangleFilter>::New();
>>>>>
>>>>>     tfilter->SetInputData(polyData);
>>>>>
>>>>>     tfilter->Update();
>>>>>
>>>>>
>>>>>
>>>>>     vtkSmartPointer<vtkPolyDataMapper> pmapper = vtkSmartPointer<vtkPolyDataMapper>::New();
>>>>>
>>>>>     pmapper->SetInputConnection(tfilter->GetOutputPort());
>>>>>
>>>>>
>>>>>     vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
>>>>>
>>>>>     actor->SetMapper(pmapper);
>>>>>
>>>>>     actor->GetProperty()->SetRepresentationToSurface();
>>>>>
>>>>>     actor->GetProperty()->EdgeVisibilityOn();
>>>>>
>>>>>     actor->GetProperty()->SetEdgeColor(1.0, 0.0, 0.0);
>>>>>
>>>>>
>>>>>     renderer->AddActor(actor);
>>>>>
>>>>>     renderer->ResetCamera();
>>>>>
>>>>>
>>>>>
>>>>> I am not able to view the output if I use vtkTriangleFilter. I have
>>>>> attached two screenshots. One is to show how the expected output should
>>>>> come. Another is the vtk's output without applying vtkTriangleFilter. How
>>>>> do I get the curved surfaces based on the above geometry (points)?
>>>>>
>>>>>
>>>>> Am I missing anything there?
>>>>>
>>>>>
>>>>>
>>>>> Thanks & Regards
>>>>>
>>>>> Rakesh Patil
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> 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
>>>>>
>>>>> Search the list archives at: http://markmail.org/search/?q=vtkusers
>>>>>
>>>>> Follow this link to subscribe/unsubscribe:
>>>>> http://public.kitware.com/mailman/listinfo/vtkusers
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> 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
>>>>
>>>> Search the list archives at: http://markmail.org/search/?q=vtkusers
>>>>
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://public.kitware.com/mailman/listinfo/vtkusers
>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20170417/8b39e36e/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: non_planar_polygon.png
Type: image/png
Size: 92659 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20170417/8b39e36e/attachment-0001.png>
-------------- next part --------------
#include <vtkVersion.h>
#include <vtkSmartPointer.h>
#include <vtkStructuredGrid.h>
#include <vtkXMLStructuredGridWriter.h>
#include <vtkDataSetMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
 
int main(int, char *[])
{
  // Create a grid
  vtkSmartPointer<vtkStructuredGrid> structuredGrid =
    vtkSmartPointer<vtkStructuredGrid>::New();
 
  vtkSmartPointer<vtkPoints> points =
    vtkSmartPointer<vtkPoints>::New();
  double x, y, z;
  x = y = z = 0.0;

  const vtkIdType nXY = 14, nZ = 5;

  double xPts[nXY] = {4.39116, 4.08748, 3.05391, 1.74755, 0.28509,
      -1.20284, -2.58332, -3.73305, -4.54931, -4.95919, -4.92609,
      -4.45295, -3.58205, -2.39117};
  double yPts[nXY] = {-2.39117, -2.87967, -3.95899, -4.68466, -4.99187,
      -4.85316, -4.28094, -3.32631, -2.07456, -0.637487, 0.856528,
      2.27403, 3.4884, 4.39116};
  double zPts[nZ] = {0.0, 1.5, 3.0, 4.5, 6.0};

  for(unsigned int k = 0; k < nZ; ++k)
    {
    z = zPts[k];
    for(unsigned int i = 0; i < nXY; ++i)
      {
      x = xPts[i];
      y = yPts[i]; 
      points->InsertNextPoint(x, y, z);
      }
    }
 
  // Specify the dimensions of the grid
  structuredGrid->SetDimensions(nXY,1,nZ);
  structuredGrid->SetPoints(points);
 
  int* dims = structuredGrid->GetDimensions();
 
  // Retrieve the entries from the grid and print them to the screen
  unsigned int counter = 0;
 
  for (int k = 0; k < dims[2]; k++)
    {
    for (int j = 0; j < dims[1]; j++)
      {
      for (int i = 0; i < dims[0]; i++)
        {
        double p[3];
        structuredGrid->GetPoint(counter, p);
 
        double pNew[3];
        structuredGrid->GetPoint(i, j, k, pNew);
 
        std::cout << "P   : " 
                  << p[0] << " " 
                  << p[1] << " " 
                  << p[2] << std::endl;
        std::cout << "PNew: " 
                  << pNew[0] << " "
                  << pNew[1] << " " 
                  << pNew[2] << std::endl;
 
        counter++;
        }
      }
    }

  vtkSmartPointer<vtkXMLStructuredGridWriter> writer =
    vtkSmartPointer<vtkXMLStructuredGridWriter>::New();
  writer->SetInputData(structuredGrid);
  writer->SetFileName("cyl.vts");
  writer->Write();
 
  // Create a mapper and actor
  vtkSmartPointer<vtkDataSetMapper> mapper =
    vtkSmartPointer<vtkDataSetMapper>::New();
#if VTK_MAJOR_VERSION <= 5
  mapper->SetInputConnection(structuredGrid->GetProducerPort());
#else
  mapper->SetInputData(structuredGrid);
#endif
 
  vtkSmartPointer<vtkActor> actor =
    vtkSmartPointer<vtkActor>::New();
  actor->SetMapper(mapper);
 
  // Create a renderer, render window, and interactor
  vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);
 
  // Add the actor to the scene
  renderer->AddActor(actor);
  renderer->SetBackground(.3, .6, .3); // Background color green
 
  // Render and interact
  renderWindow->Render();
  renderWindowInteractor->Start();
 
  return EXIT_SUCCESS;
}


More information about the vtkusers mailing list