You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
6.4 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkContourLoopExtraction.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 vtkContourLoopExtraction
* @brief extract closed loops (polygons) from lines and polylines
*
* This filter takes an input consisting of lines and polylines and
* constructs polygons (i.e., closed loops) from them. It combines some of
* the capability of connectivity filters and the line stripper to produce
* manifold loops that are suitable for geometric operations. For example,
* the vtkCookieCutter works well with this filter.
*
* Note that the input structure for this filter consists of points and line
* or polyline cells. All other topological types (verts, polygons, triangle
* strips) are ignored. The output of this filter is by default manifold
* polygons. Note however, that optionally polyline loops may also be output
* if requested.
*
* @warning
* Although the loops are constructed in 3-space, a normal vector must be
* supplied to help choose a turn direction when multiple choices are
* possible. By default the normal vector is n={0,0,1} but may be user
* specified. Note also that some filters require that the loops are located
* in the z=constant or z=0 plane. Hence a transform filter of some sort may
* be necesssary to project the loops to a plane.
*
* @warning
* Note that lines that do not close in on themselves can be optionally
* forced closed. This occurs when for example, 2D contours end and begin at
* the boundaries of data. By forcing closure, the last point is joined to
* the first point (with boundary points possibly added). Note that there are
* different closure modes: 1) do not close (and hence reject the polygon);
* 2) close along the dataset boundaries (i.e., the bounding box of a dataset
* used to generate the contour lines); and 3) close all open loops by
* connectiong the first and last point. If Option #2 is chosen, only loops
* that start and end on either a horizontal or vertical boundary are closed.
*
* @warning
* Scalar thresholding can be enabled. If enabled, then only those loops with
* *any" scalar point data within the thresholded range are extracted.
*
* @warning
* Any detached lines forming degenerate loops of defined by two points or
* less are discarded. Non-manifold junctions are broken into separate,
* independent loops.
*
* @warning
* Boundary closure only works if the end points are both on a vertical
* boundary or horizontal boundary. Otherwise new points would have to be
* added which this filter does not (currently) do.
*
* @sa
* vtkCookieCutter vtkFlyingEdges2D vtkMarchingSquares vtkFeatureEdges
* vtkConnectivityFilter vtkPolyDataConnectivityFilter
* vtkDiscreteFlyingEdges2D vtkStripper
*/
#ifndef vtkContourLoopExtraction_h
#define vtkContourLoopExtraction_h
#include "vtkFiltersModelingModule.h" // For export macro
#include "vtkPolyDataAlgorithm.h"
#define VTK_LOOP_CLOSURE_OFF 0
#define VTK_LOOP_CLOSURE_BOUNDARY 1
#define VTK_LOOP_CLOSURE_ALL 2
#define VTK_OUTPUT_POLYGONS 0
#define VTK_OUTPUT_POLYLINES 1
#define VTK_OUTPUT_BOTH 2
class VTKFILTERSMODELING_EXPORT vtkContourLoopExtraction : public vtkPolyDataAlgorithm
{
public:
//@{
/**
* Standard methods to instantiate, print and provide type information.
*/
static vtkContourLoopExtraction* New();
vtkTypeMacro(vtkContourLoopExtraction, vtkPolyDataAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
//@{
/**
* Specify whether to close loops or not. All non-closed loops can be
* rejected; boundary loops (end points lie on vertical or horizontal
* porions of the boundary) can be closed (default); or all loops can be
* forced closed by connecting first and last points.
*/
vtkSetClampMacro(LoopClosure, int, VTK_LOOP_CLOSURE_OFF, VTK_LOOP_CLOSURE_ALL);
vtkGetMacro(LoopClosure, int);
void SetLoopClosureToOff() { this->SetLoopClosure(VTK_LOOP_CLOSURE_OFF); }
void SetLoopClosureToBoundary() { this->SetLoopClosure(VTK_LOOP_CLOSURE_BOUNDARY); }
void SetLoopClosureToAll() { this->SetLoopClosure(VTK_LOOP_CLOSURE_ALL); }
const char* GetLoopClosureAsString();
//@}
//@{
/**
* Turn on/off the extraction of loops based on scalar thresholding. Loops
* with scalar values in a specified range can be extracted. If no scalars
* are available from the input than this data member is ignored.
*/
vtkSetMacro(ScalarThresholding, bool);
vtkGetMacro(ScalarThresholding, bool);
vtkBooleanMacro(ScalarThresholding, bool);
//@}
//@{
/**
* Set the scalar range to use to extract loop based on scalar
* thresholding. If any scalar, point data, in the loop falls into the
* scalar range given, then the loop is extracted.
*/
vtkSetVector2Macro(ScalarRange, double);
vtkGetVector2Macro(ScalarRange, double);
//@}
//@{
/**
* Set the normal vector used to orient the algorithm (controlling turns
* around the loop). By default the normal points in the +z direction.
*/
vtkSetVector3Macro(Normal, double);
vtkGetVector3Macro(Normal, double);
//@}
//@{
/**
* Specify the form of the output. Polygons can be output (default);
* polylines can be output (the first and last point is repeated); or both
* can be output.
*/
vtkSetClampMacro(OutputMode, int, VTK_OUTPUT_POLYGONS, VTK_OUTPUT_BOTH);
vtkGetMacro(OutputMode, int);
void SetOutputModeToPolygons() { this->SetOutputMode(VTK_OUTPUT_POLYGONS); }
void SetOutputModeToPolylines() { this->SetOutputMode(VTK_OUTPUT_POLYLINES); }
void SetOutputModeToBoth() { this->SetOutputMode(VTK_OUTPUT_BOTH); }
const char* GetOutputModeAsString();
//@}
protected:
vtkContourLoopExtraction();
~vtkContourLoopExtraction() override;
int LoopClosure;
bool ScalarThresholding;
double ScalarRange[2];
double Normal[3];
int OutputMode;
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
private:
vtkContourLoopExtraction(const vtkContourLoopExtraction&) = delete;
void operator=(const vtkContourLoopExtraction&) = delete;
};
#endif