/*=========================================================================
Program: Visualization Toolkit
Module: vtkCurvatures.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkCurvatures
* @brief compute curvatures (Gauss and mean) of a Polydata object
*
* vtkCurvatures takes a polydata input and computes the curvature of the
* mesh at each point. Four possible methods of computation are available :
*
* Gauss Curvature discrete Gauss curvature (\f$ K \f$),
* \f$K_v = 2\pi-n_vf_v(\alpha)\f$, where \f$K_v\f$ is the curvature
* at vertex \f$v\f$, \f$n_v\f$ the facet neighbours of the vertex \f$v\f$
* and \f$f_v(\alpha)\f$ is the angle of \f$f\f$ at vertex \f$v\f$.
* The contribution of every facet is for the moment weighted by the
* (area of each facet)/3 The units of Gaussian Curvature are \f$m^{-2}\f$.
*
* Mean Curvature \f$H_v = \overline{H_e}\f$, where \f$\overline{H_e}\f$ is
* the average over the edge neighbours of \f$H_e\f$.
* \f$H_e = l(e)*\alpha(e)\f$ where \f$e\f$ is an edge, \f$l\f$ is the length
* and \f$\alpha\f$ is the dihederal angle such that
* \f$-\pi < \alpha < \pi\f$. This means that the surface is assumed to
* be orientable and the computation creates the orientation. The units of
* Mean Curvature are \f$m^{-1}\f$.
*
* Maximum (\f$k_{max}\f$) and Minimum (\f$k_{min}\f$) Principal Curvatures
* are \f$k_{max} = H + \sqrt{H^2 - K}\f$ and
* \f$k_{min} = H - \sqrt{H^2 - K}\f$.
* Excepting spherical and planar surfaces which have equal
* principal curvatures, the curvature at a point on a surface varies with
* the direction one "sets off" from the point. For all directions, the
* curvature will pass through two extrema: a minimum (\f$k_{min}\f$) and a
* maximum (\f$k_{max}\f$) which occur at mutually orthogonal directions
* to each other.
*
* The sign of the Gauss curvature is a geometric ivariant, it should be
* positive when the surface looks like a sphere, negative when it looks
* like a saddle, however, the sign of the Mean curvature is not, it depends
* on the convention for normals, This code assumes that normals point
* outwards (ie from the surface of a sphere outwards). If a given mesh
* produces curvatures of opposite senses then the flag InvertMeanCurvature
* can be set and the Curvature reported by the Mean calculation will
* be inverted.
*
* For a little more information see
* Computing curvature of a surface
*
* @par Thanks:
* Philip Batchelor
* for creating and contributing the class and Andrew Maclean for cleanups and
* fixes. Thanks also to John Biddiscombe for adding the class and
* Goodwin Lawlor for contributing a patch to calculate principal curvatures
*
*/
#ifndef vtkCurvatures_h
#define vtkCurvatures_h
#include "vtkFiltersGeneralModule.h" // For export macro
#include "vtkPolyDataAlgorithm.h"
#define VTK_CURVATURE_GAUSS 0
#define VTK_CURVATURE_MEAN 1
#define VTK_CURVATURE_MAXIMUM 2
#define VTK_CURVATURE_MINIMUM 3
class VTKFILTERSGENERAL_EXPORT vtkCurvatures : public vtkPolyDataAlgorithm
{
public:
vtkTypeMacro(vtkCurvatures, vtkPolyDataAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Construct with curvature type set to Gauss
*/
static vtkCurvatures* New();
///@{
/**
* Set/Get Curvature type
* VTK_CURVATURE_GAUSS: Gaussian curvature, stored as
* DataArray "Gauss_Curvature"
* VTK_CURVATURE_MEAN : Mean curvature, stored as
* DataArray "Mean_Curvature"
*/
vtkSetMacro(CurvatureType, int);
vtkGetMacro(CurvatureType, int);
void SetCurvatureTypeToGaussian() { this->SetCurvatureType(VTK_CURVATURE_GAUSS); }
void SetCurvatureTypeToMean() { this->SetCurvatureType(VTK_CURVATURE_MEAN); }
void SetCurvatureTypeToMaximum() { this->SetCurvatureType(VTK_CURVATURE_MAXIMUM); }
void SetCurvatureTypeToMinimum() { this->SetCurvatureType(VTK_CURVATURE_MINIMUM); }
///@}
///@{
/**
* Set/Get the flag which inverts the mean curvature calculation for
* meshes with inward pointing normals (default false)
*/
vtkSetMacro(InvertMeanCurvature, vtkTypeBool);
vtkGetMacro(InvertMeanCurvature, vtkTypeBool);
vtkBooleanMacro(InvertMeanCurvature, vtkTypeBool);
///@}
protected:
vtkCurvatures();
// Usual data generation method
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
/**
* Discrete Gauss curvature (K) computation
*/
void GetGaussCurvature(vtkPolyData* output);
void ComputeGaussCurvature(vtkCellArray* facets, vtkPolyData* output, double* gaussCurvatureData);
/**
* Discrete Mean curvature (H) computation
*/
void GetMeanCurvature(vtkPolyData* output);
/**
* Maximum principal curvature
*/
void GetMaximumCurvature(vtkPolyData* input, vtkPolyData* output);
/**
* Minimum principal curvature
*/
void GetMinimumCurvature(vtkPolyData* input, vtkPolyData* output);
// Vars
int CurvatureType;
vtkTypeBool InvertMeanCurvature;
private:
vtkCurvatures(const vtkCurvatures&) = delete;
void operator=(const vtkCurvatures&) = delete;
};
#endif