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.
nmWTAI-Platform/3rd/VTK7.1/include/vtkExtractSelectedFrustum.h

179 lines
5.1 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkExtractSelectedFrustum.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 vtkExtractSelectedFrustum
* @brief Returns the portion of the input dataset that
* lies within a selection frustum.
*
*
* This class intersects the input DataSet with a frustum and determines which
* cells and points lie within the frustum. The frustum is defined with a
* vtkPlanes containing six cutting planes. The output is a DataSet that is
* either a shallow copy of the input dataset with two new "vtkInsidedness"
* attribute arrays, or a completely new UnstructuredGrid that contains only
* the cells and points of the input that are inside the frustum. The
* PreserveTopology flag controls which occurs. When PreserveTopology is off
* this filter adds a scalar array called vtkOriginalCellIds that says what
* input cell produced each output cell. This is an example of a Pedigree ID
* which helps to trace back results.
*
* @sa
* vtkExtractGeometry, vtkAreaPicker, vtkExtractSelection, vtkSelection
*/
#ifndef vtkExtractSelectedFrustum_h
#define vtkExtractSelectedFrustum_h
#include "vtkFiltersGeneralModule.h" // For export macro
#include "vtkExtractSelectionBase.h"
class vtkPlanes;
class vtkInformation;
class vtkInformationVector;
class vtkCell;
class vtkPoints;
class vtkDoubleArray;
class VTKFILTERSGENERAL_EXPORT vtkExtractSelectedFrustum : public vtkExtractSelectionBase
{
public:
static vtkExtractSelectedFrustum *New();
vtkTypeMacro(vtkExtractSelectedFrustum, vtkExtractSelectionBase);
void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE;
/**
* Return the MTime taking into account changes to the Frustum
*/
vtkMTimeType GetMTime() VTK_OVERRIDE;
//@{
/**
* Set the selection frustum. The planes object must contain six planes.
*/
virtual void SetFrustum(vtkPlanes*);
vtkGetObjectMacro(Frustum,vtkPlanes);
//@}
/**
* Given eight vertices, creates a frustum.
* each pt is x,y,z,1
* in the following order
* near lower left, far lower left
* near upper left, far upper left
* near lower right, far lower right
* near upper right, far upper right
*/
void CreateFrustum(double vertices[32]);
//@{
/**
* Return eight points that define the selection frustum. Valid if
* create Frustum was used, invalid if SetFrustum was.
*/
vtkGetObjectMacro(ClipPoints, vtkPoints);
//@}
//@{
/**
* Sets/gets the intersection test type.
*/
vtkSetMacro(FieldType,int);
vtkGetMacro(FieldType,int);
//@}
//@{
/**
* Sets/gets the intersection test type. Only meaningful when fieldType is
* vtkSelection::POINT
*/
vtkSetMacro(ContainingCells,int);
vtkGetMacro(ContainingCells,int);
//@}
/**
* Does a quick test on the AABBox defined by the bounds.
*/
int OverallBoundsTest(double *bounds);
//@{
/**
* When On, this returns an unstructured grid that outlines selection area.
* Off is the default.
*/
vtkSetMacro(ShowBounds,int);
vtkGetMacro(ShowBounds,int);
vtkBooleanMacro(ShowBounds,int);
//@}
//@{
/**
* When on, extracts cells outside the frustum instead of inside.
*/
vtkSetMacro(InsideOut,int);
vtkGetMacro(InsideOut,int);
vtkBooleanMacro(InsideOut,int);
//@}
protected:
vtkExtractSelectedFrustum(vtkPlanes *f=NULL);
~vtkExtractSelectedFrustum() VTK_OVERRIDE;
// sets up output dataset
int RequestDataObject(vtkInformation* request,
vtkInformationVector** inputVector,
vtkInformationVector* outputVector) VTK_OVERRIDE;
//execution
int RequestData(vtkInformation *,
vtkInformationVector **, vtkInformationVector *) VTK_OVERRIDE;
int ABoxFrustumIsect(double bounds[], vtkCell *cell);
int FrustumClipPolygon(int nverts,
double *ivlist, double *wvlist, double *ovlist);
void PlaneClipPolygon(int nverts, double *ivlist,
int pid, int &noverts, double *ovlist);
void PlaneClipEdge(double *V0, double *V1,
int pid, int &noverts, double *overts);
int IsectDegenerateCell(vtkCell *cell);
//used in CreateFrustum
void ComputePlane(int idx,
double v0[3], double v1[2], double v2[3],
vtkPoints *points, vtkDoubleArray *norms);
//modes
int FieldType;
int ContainingCells;
int InsideOut;
//used internally
vtkPlanes *Frustum;
int np_vertids[6][2];
//for debugging
vtkPoints *ClipPoints;
int NumRejects;
int NumIsects;
int NumAccepts;
int ShowBounds;
private:
vtkExtractSelectedFrustum(const vtkExtractSelectedFrustum&) VTK_DELETE_FUNCTION;
void operator=(const vtkExtractSelectedFrustum&) VTK_DELETE_FUNCTION;
};
#endif