[vtkusers] Problem with "Compute Gaussian, Mean, Minm and Max Curvatures" example
Andrew Maclean
andrew.amaclean at gmail.com
Tue Aug 26 19:26:11 EDT 2014
I was one of the original authors of this class.
Some points to remember are:
1) Curvatures are calculated on a triangulated surface using the vertices
of the triangles.
2) The ideal case would be a large number of small triangles across the
surface.
3) If the surface is planar then the edges of the plane may have large
values - especially at the corners so it is best to use a clip function
after applying the filter.
4) If the surface is a deformed plane e.g. vtkParametricRandomHills then
most of the gaussian curvatures will lie in the range -1 to 0.2 (say) with
a few large values say 20 to 40 at the peaks of the hills. You may need to
tailor your lookup table
to account for this.
Here is a beautiful example (in my opinion) I made using
http://www.vtk.org/Wiki/VTK/Examples/Python/CurvaturesDemo and
http://www.vtk.org/Wiki/VTK/Examples/Python/Visualization/ElevationBandsWithGlyphs
It uses a torus and a banded polydata contour filter, I have also added
normal glyphs to the surface.
I will most likely add a C++ and Python example similar to this.
Regards
Andrew
---------- Forwarded message ----------
> From: Sky77 <Joan.Hensen at outlook.de>
> To: vtkusers at vtk.org
> Cc:
> Date: Tue, 26 Aug 2014 07:35:48 -0700 (PDT)
> Subject: Re: [vtkusers] Problem with "Compute Gaussian, Mean, Minm and Max
> Curvatures" example
> It seems that my version of VTK is to old. The header file
> vtkBooleanOperationPolyDataFilter.h can't be found. For this purpose, i
> have
> try something else to get an object with negative Gaussian curvature. A
> torus have positive Gaussian curvature on the outside and negative Gaussian
> curvature on the inside. I have created one with blender and import it as
> obj file.
>
> This ist the input file: torus.obj
> <http://vtk.1045678.n5.nabble.com/file/n5728401/torus.obj>
>
> Here <http://vtk.1045678.n5.nabble.com/file/n5728401/result.png> you can
> see my result. Also in this case no negative curvature is computed.
>
> Has someone of you experience with the curvature computation with vtk? I
> mean has someone used this functionality with success?
>
> #include <vtkSmartPointer.h>
> #include <vtkCurvatures.h>
> #include <vtkXMLPolyDataReader.h>
> #include <vtkLookupTable.h>
> #include <vtkColorTransferFunction.h>
> #include <vtkColorSeries.h>
> #include <vtkPointData.h>
> #include <vtkPolyDataMapper.h>
> #include <vtkActor.h>
> #include <vtkScalarBarActor.h>
> #include <vtkRenderWindow.h>
> #include <vtkRenderer.h>
> #include <vtkRenderWindowInteractor.h>
> #include <vtkOBJReader.h>
> #include <vtkUnstructuredGrid.h>
> #include <vtkCell.h>
> #include <vtkCellArray.h>
> #include <vtkIdList.h>
> #include <vtkUnsignedCharArray.h>
> #include <string>
>
> int main(int argc, char *argv[])
> {
> // Parse command line arguments
> if(argc != 2)
> {
> std::cout << "Usage: " << argv[0] << " Filename(.obj)" <<
> std::endl;
> return EXIT_FAILURE;
> }
>
> std::string filename = argv[1];
> vtkSmartPointer<vtkOBJReader> reader =
> vtkSmartPointer<vtkOBJReader>::New();
> reader->SetFileName(filename.c_str());
> reader->Update();
>
> vtkSmartPointer<vtkCurvatures> curvaturesFilter =
> vtkSmartPointer<vtkCurvatures>::New();
> curvaturesFilter->SetInputConnection(reader->GetOutputPort());
> curvaturesFilter->SetCurvatureTypeToGaussian();
> curvaturesFilter->Update();
>
> // Get scalar range from command line if present, otherwise use
> // range of computed curvature
> double scalarRange[2];
> if (argc >= 4)
> {
> scalarRange[0] = atof(argv[2]);
> scalarRange[1] = atof(argv[3]);
> }
> else
> {
> curvaturesFilter->GetOutput()->GetScalarRange(scalarRange);
> }
>
> int scheme = 16;
> if (argc >= 5)
> {
> scheme = atoi(argv[4]);
> }
>
> // Build a lookup table
> vtkSmartPointer<vtkColorSeries> colorSeries =
> vtkSmartPointer<vtkColorSeries>::New();
> colorSeries->SetColorScheme(scheme);
>
> vtkSmartPointer<vtkColorTransferFunction> lut =
> vtkSmartPointer<vtkColorTransferFunction>::New();
> lut->SetColorSpaceToHSV();
>
> // Use a color series to create a transfer function
> int numColors = colorSeries->GetNumberOfColors();
> for (int i = 0; i < numColors; i++)
> {
> vtkColor3ub color = colorSeries->GetColor(i);
> double dColor[3];
> dColor[0] = static_cast<double> (color[0]) / 255.0;
> dColor[1] = static_cast<double> (color[1]) / 255.0;
> dColor[2] = static_cast<double> (color[2]) / 255.0;
> double t = scalarRange[0] + (scalarRange[1] - scalarRange[0]) /
> (numColors - 1) * i;
> lut->AddRGBPoint(t, dColor[0], dColor[1], dColor[2]);
> }
>
> // Create a mapper and actor
> vtkSmartPointer<vtkPolyDataMapper> mapper =
> vtkSmartPointer<vtkPolyDataMapper>::New();
> mapper->SetInputConnection(curvaturesFilter->GetOutputPort());
> // mapper->SetLookupTable(lut);
> mapper->SetScalarRange(scalarRange);
>
> vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
> actor->SetMapper(mapper);
>
> // Create a scalar bar
> vtkSmartPointer<vtkScalarBarActor> scalarBar =
> vtkSmartPointer<vtkScalarBarActor>::New();
> scalarBar->SetLookupTable(mapper->GetLookupTable());
>
>
> scalarBar->SetTitle(curvaturesFilter->GetOutput()->GetPointData()->GetScalars()->GetName());
> scalarBar->SetNumberOfLabels(5);
>
> // 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 actors to the scene
> renderer->AddActor(actor);
> renderer->AddActor2D(scalarBar);
>
> renderer->SetBackground(.1, .2, .3); // Background color blue
>
> // Render and interact
> renderWindow->Render();
> renderWindowInteractor->Start();
>
> return EXIT_SUCCESS;
>
> }
> --
>
___________________________________________
Andrew J. P. Maclean
___________________________________________
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20140827/cf5d4682/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CurvatureBandsWithGlyphs.zip
Type: application/zip
Size: 5384 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20140827/cf5d4682/attachment-0001.zip>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CurvatureBandsWithGlyphs.png
Type: image/png
Size: 104633 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20140827/cf5d4682/attachment-0001.png>
More information about the vtkusers
mailing list