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.
171 lines
5.0 KiB
C++
171 lines
5.0 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 "vtkExtractSelectionBase.h"
|
|
#include "vtkFiltersGeneralModule.h" // For export macro
|
|
|
|
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) override;
|
|
|
|
/**
|
|
* Return the MTime taking into account changes to the Frustum
|
|
*/
|
|
vtkMTimeType GetMTime() 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, vtkTypeBool);
|
|
vtkGetMacro(ShowBounds, vtkTypeBool);
|
|
vtkBooleanMacro(ShowBounds, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* When on, extracts cells outside the frustum instead of inside.
|
|
*/
|
|
vtkSetMacro(InsideOut, vtkTypeBool);
|
|
vtkGetMacro(InsideOut, vtkTypeBool);
|
|
vtkBooleanMacro(InsideOut, vtkTypeBool);
|
|
//@}
|
|
|
|
protected:
|
|
vtkExtractSelectedFrustum(vtkPlanes* f = nullptr);
|
|
~vtkExtractSelectedFrustum() override;
|
|
|
|
// sets up output dataset
|
|
int RequestDataObject(vtkInformation* request, vtkInformationVector** inputVector,
|
|
vtkInformationVector* outputVector) override;
|
|
|
|
// execution
|
|
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) 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;
|
|
vtkTypeBool InsideOut;
|
|
|
|
// used internally
|
|
vtkPlanes* Frustum;
|
|
int np_vertids[6][2];
|
|
|
|
// for debugging
|
|
vtkPoints* ClipPoints;
|
|
int NumRejects;
|
|
int NumIsects;
|
|
int NumAccepts;
|
|
vtkTypeBool ShowBounds;
|
|
|
|
private:
|
|
vtkExtractSelectedFrustum(const vtkExtractSelectedFrustum&) = delete;
|
|
void operator=(const vtkExtractSelectedFrustum&) = delete;
|
|
};
|
|
|
|
#endif
|