You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
5.1 KiB
140 lines
5.1 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkCurvatures.h,v $
|
|
|
|
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.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkCurvatures - compute curvatures (Gauss and mean) of a Polydata object
|
|
// .SECTION Description
|
|
// 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 (K) computation,
|
|
// \f$K(vertex v) = 2*PI-\sum_{facet neighbs f of v} (angle_f at v)\f$
|
|
// The contribution of every facet is for the moment weighted by \f$Area(facet)/3\f$
|
|
// The units of Gaussian Curvature are \f$[1/m^2]\f$
|
|
//
|
|
// Mean Curvature
|
|
// \f$H(vertex v) = average over edges neighbs e of H(e)\f$
|
|
// \f$H(edge e) = length(e)*dihedral_angle(e)\f$
|
|
// NB: dihedral_angle is the ORIENTED angle between -PI and PI,
|
|
// this means that the surface is assumed to be orientable
|
|
// the computation creates the orientation
|
|
// The units of Mean Curvature are [1/m]
|
|
//
|
|
// Maximum (\f$k_max\f$) and Minimum (\f$k_min\f$) Principal Curvatures
|
|
// \f$k_max = H + sqrt(H^2 - K)\f$
|
|
// \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.
|
|
//
|
|
// NB. The sign of the Gauss curvature is a geometric ivariant, it should be +ve
|
|
// when the surface looks like a sphere, -ve 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.
|
|
//
|
|
// .SECTION Thanks
|
|
// Philip Batchelor philipp.batchelor@kcl.ac.uk for creating and contributing
|
|
// the class and Andrew Maclean a.maclean@acfr.usyd.edu.au for cleanups and
|
|
// fixes. Thanks also to Goodwin Lawlor for contributing patch to calculate
|
|
// principal curvatures
|
|
|
|
//
|
|
// .SECTION See Also
|
|
//
|
|
|
|
#ifndef __vtkCurvatures_h
|
|
#define __vtkCurvatures_h
|
|
|
|
#include "vtkPolyDataAlgorithm.h"
|
|
|
|
#define VTK_CURVATURE_GAUSS 0
|
|
#define VTK_CURVATURE_MEAN 1
|
|
#define VTK_CURVATURE_MAXIMUM 2
|
|
#define VTK_CURVATURE_MINIMUM 3
|
|
|
|
class VTK_GRAPHICS_EXPORT vtkCurvatures : public vtkPolyDataAlgorithm
|
|
{
|
|
public:
|
|
vtkTypeRevisionMacro(vtkCurvatures,vtkPolyDataAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Construct with curvature type set to Gauss
|
|
static vtkCurvatures *New();
|
|
|
|
// Description:
|
|
// 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); }
|
|
|
|
// Description:
|
|
// Set/Get the flag which inverts the mean curvature calculation for
|
|
// meshes with inward pointing normals (default false)
|
|
vtkSetMacro(InvertMeanCurvature,int);
|
|
vtkGetMacro(InvertMeanCurvature,int);
|
|
vtkBooleanMacro(InvertMeanCurvature,int);
|
|
protected:
|
|
vtkCurvatures();
|
|
|
|
// Usual data generation method
|
|
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
|
|
|
|
// Description:
|
|
// discrete Gauss curvature (K) computation,
|
|
// cf http://www-ipg.umds.ac.uk/p.batchelor/curvatures/curvatures.html
|
|
void GetGaussCurvature(vtkPolyData *output);
|
|
|
|
// discrete Mean curvature (H) computation,
|
|
// cf http://www-ipg.umds.ac.uk/p.batchelor/curvatures/curvatures.html
|
|
void GetMeanCurvature(vtkPolyData *output);
|
|
|
|
//Description:
|
|
// Maximum principal curvature \f$k_max = H + sqrt(H^2 -K)\f$
|
|
void GetMaximumCurvature(vtkPolyData *input, vtkPolyData *output);
|
|
|
|
//Description:
|
|
// Minimum principal curvature \f$k_min = H - sqrt(H^2 -K)\f$
|
|
void GetMinimumCurvature(vtkPolyData *input, vtkPolyData *output);
|
|
|
|
|
|
// Vars
|
|
int CurvatureType;
|
|
int InvertMeanCurvature;
|
|
|
|
private:
|
|
vtkCurvatures(const vtkCurvatures&); // Not implemented.
|
|
void operator=(const vtkCurvatures&); // Not implemented.
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|