/*========================================================================= Program: Visualization Toolkit Module: vtkConvexHull2D.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 vtkConvexHull2D * @brief Produce filled convex hulls around a set of points. * * * Produces a vtkPolyData comprised of a filled polygon of the convex hull * of the input points. You may alternatively choose to output a bounding * rectangle. Static methods are provided that calculate a (counter-clockwise) * hull based on a set of input points. * * To help maintain the property of guaranteed visibility hulls may be * artificially scaled by setting MinHullSizeInWorld. This is particularly * helpful in the case that there are only one or two points as it avoids * producing a degenerate polygon. This setting is also available as an * argument to the static methods. * * Setting a vtkRenderer on the filter enables the possibility to set * MinHullSizeInDisplay to the desired number of display pixels to cover in * each of the x- and y-dimensions. * * Setting OutlineOn() additionally produces an outline of the hull on output * port 1. * * @attention * This filter operates in the x,y-plane and as such works best with an * interactor style that does not permit camera rotation such as * vtkInteractorStyleRubberBand2D. * * @par Thanks: * Thanks to Colin Myers, University of Leeds for providing this implementation. */ #ifndef vtkConvexHull2D_h #define vtkConvexHull2D_h #include "vtkPolyDataAlgorithm.h" #include "vtkRenderingAnnotationModule.h" // For export macro #include "vtkSmartPointer.h" // needed for ivars class vtkCoordinate; class vtkPoints; class vtkPolygon; class vtkPolyLine; class vtkRenderer; class vtkTransform; class vtkTransformPolyDataFilter; class VTKRENDERINGANNOTATION_EXPORT vtkConvexHull2D : public vtkPolyDataAlgorithm { public: static vtkConvexHull2D* New(); vtkTypeMacro(vtkConvexHull2D, vtkPolyDataAlgorithm); void PrintSelf(ostream& os, vtkIndent indent) override; //@{ /** * Scale the hull by the amount specified. Defaults to 1.0. */ vtkGetMacro(ScaleFactor, double); vtkSetMacro(ScaleFactor, double); //@} //@{ /** * Produce an outline (polyline) of the hull on output port 1. */ vtkGetMacro(Outline, bool); vtkSetMacro(Outline, bool); vtkBooleanMacro(Outline, bool); //@} enum HullShapes { BoundingRectangle = 0, ConvexHull }; //@{ /** * Set the shape of the hull to BoundingRectangle or ConvexHull. */ vtkGetMacro(HullShape, int); vtkSetClampMacro(HullShape, int, 0, 1); //@} //@{ /** * Set the minimum x,y-dimensions of each hull in world coordinates. Defaults * to 1.0. Set to 0.0 to disable. */ vtkSetClampMacro(MinHullSizeInWorld, double, 0.0, VTK_DOUBLE_MAX); vtkGetMacro(MinHullSizeInWorld, double); //@} //@{ /** * Set the minimum x,y-dimensions of each hull in pixels. You must also set a * vtkRenderer. Defaults to 1. Set to 0 to disable. */ vtkSetClampMacro(MinHullSizeInDisplay, int, 0, VTK_INT_MAX); vtkGetMacro(MinHullSizeInDisplay, int); //@} //@{ /** * Renderer needed for MinHullSizeInDisplay calculation. Not reference counted. */ void SetRenderer(vtkRenderer* renderer); vtkRenderer* GetRenderer(); //@} /** * The modified time of this filter. */ vtkMTimeType GetMTime() override; //@{ /** * Convenience methods to calculate a convex hull from a set of vtkPointS. */ static void CalculateBoundingRectangle( vtkPoints* inPoints, vtkPoints* outPoints, double minimumHullSize = 1.0); static void CalculateConvexHull( vtkPoints* inPoints, vtkPoints* outPoints, double minimumHullSize = 1.0); //@} protected: vtkConvexHull2D(); ~vtkConvexHull2D() override; /** * This is called by the superclass. This is the method you should override. */ int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; private: vtkConvexHull2D(const vtkConvexHull2D&) = delete; void operator=(const vtkConvexHull2D&) = delete; void ResizeHullToMinimumInDisplay(vtkPolyData* hullPolyData); double ScaleFactor; bool Outline; int HullShape; int MinHullSizeInDisplay; double MinHullSizeInWorld; vtkRenderer* Renderer; vtkSmartPointer Coordinate; vtkSmartPointer Transform; vtkSmartPointer OutputTransform; vtkSmartPointer OutputTransformFilter; vtkSmartPointer OutlineSource; vtkSmartPointer HullSource; }; #endif // vtkConvexHull2D_h