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.
288 lines
12 KiB
C++
288 lines
12 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkAbstractCellLocator.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 vtkAbstractCellLocator
|
|
* @brief an abstract base class for locators which find cells
|
|
*
|
|
* vtkAbstractCellLocator is a spatial search object to quickly locate cells in 3D.
|
|
* vtkAbstractCellLocator supplies a basic interface which concrete subclasses
|
|
* should implement.
|
|
*
|
|
* @warning
|
|
* When deriving a class from vtkAbstractCellLocator, one should include the
|
|
* 'hidden' member functions by the following construct in the derived class
|
|
* \verbatim
|
|
* using vtkAbstractCellLocator::IntersectWithLine;
|
|
* using vtkAbstractCellLocator::FindClosestPoint;
|
|
* using vtkAbstractCellLocator::FindClosestPointWithinRadius;
|
|
* \endverbatim
|
|
*
|
|
*
|
|
* @sa
|
|
* vtkLocator vtkPointLocator vtkOBBTree vtkCellLocator
|
|
*/
|
|
|
|
#ifndef vtkAbstractCellLocator_h
|
|
#define vtkAbstractCellLocator_h
|
|
|
|
#include "vtkCommonDataModelModule.h" // For export macro
|
|
#include "vtkLocator.h"
|
|
|
|
class vtkCellArray;
|
|
class vtkGenericCell;
|
|
class vtkIdList;
|
|
class vtkPoints;
|
|
|
|
class VTKCOMMONDATAMODEL_EXPORT vtkAbstractCellLocator : public vtkLocator
|
|
{
|
|
public:
|
|
vtkTypeMacro(vtkAbstractCellLocator, vtkLocator);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
//@{
|
|
/**
|
|
* Specify the preferred/maximum number of cells in each node/bucket.
|
|
* Default 32. Locators generally operate by subdividing space into
|
|
* smaller regions until the number of cells in each region (or node)
|
|
* reaches the desired level.
|
|
*/
|
|
vtkSetClampMacro(NumberOfCellsPerNode, int, 1, VTK_INT_MAX);
|
|
vtkGetMacro(NumberOfCellsPerNode, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Boolean controls whether the bounds of each cell are computed only
|
|
* once and then saved. Should be 10 to 20% faster if repeatedly
|
|
* calling any of the Intersect/Find routines and the extra memory
|
|
* won't cause disk caching (24 extra bytes per cell are required to
|
|
* save the bounds).
|
|
*/
|
|
vtkSetMacro(CacheCellBounds, vtkTypeBool);
|
|
vtkGetMacro(CacheCellBounds, vtkTypeBool);
|
|
vtkBooleanMacro(CacheCellBounds, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Boolean controls whether to maintain list of cells in each node.
|
|
* not applicable to all implementations, but if the locator is being used
|
|
* as a geometry simplification technique, there is no need to keep them.
|
|
*/
|
|
vtkSetMacro(RetainCellLists, vtkTypeBool);
|
|
vtkGetMacro(RetainCellLists, vtkTypeBool);
|
|
vtkBooleanMacro(RetainCellLists, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Most Locators build their search structures during BuildLocator
|
|
* but some may delay construction until it is actually needed.
|
|
* If LazyEvaluation is supported, this turns on/off the feature.
|
|
* if not supported, it is ignored.
|
|
*/
|
|
vtkSetMacro(LazyEvaluation, vtkTypeBool);
|
|
vtkGetMacro(LazyEvaluation, vtkTypeBool);
|
|
vtkBooleanMacro(LazyEvaluation, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Some locators support querying a new dataset without rebuilding
|
|
* the search structure (typically this may occur when a dataset
|
|
* changes due to a time update, but is actually the same topology)
|
|
* Turning on this flag enables some locators to skip the rebuilding
|
|
* phase
|
|
*/
|
|
vtkSetMacro(UseExistingSearchStructure, vtkTypeBool);
|
|
vtkGetMacro(UseExistingSearchStructure, vtkTypeBool);
|
|
vtkBooleanMacro(UseExistingSearchStructure, vtkTypeBool);
|
|
//@}
|
|
|
|
/**
|
|
* Return intersection point (if any) of finite line with cells contained
|
|
* in cell locator. See vtkCell.h parameters documentation.
|
|
*/
|
|
virtual int IntersectWithLine(const double p1[3], const double p2[3], double tol, double& t,
|
|
double x[3], double pcoords[3], int& subId);
|
|
|
|
/**
|
|
* Return intersection point (if any) AND the cell which was intersected by
|
|
* the finite line.
|
|
*/
|
|
virtual int IntersectWithLine(const double p1[3], const double p2[3], double tol, double& t,
|
|
double x[3], double pcoords[3], int& subId, vtkIdType& cellId);
|
|
|
|
/**
|
|
* Return intersection point (if any) AND the cell which was intersected by
|
|
* the finite line. The cell is returned as a cell id and as a generic
|
|
* cell.
|
|
*/
|
|
virtual int IntersectWithLine(const double p1[3], const double p2[3], double tol, double& t,
|
|
double x[3], double pcoords[3], int& subId, vtkIdType& cellId, vtkGenericCell* cell);
|
|
|
|
/**
|
|
* Take the passed line segment and intersect it with the data set.
|
|
* This method assumes that the data set is a vtkPolyData that describes
|
|
* a closed surface, and the intersection points that are returned in
|
|
* 'points' alternate between entrance points and exit points.
|
|
* The return value of the function is 0 if no intersections were found,
|
|
* -1 if point 'a0' lies inside the closed surface, or +1 if point 'a0'
|
|
* lies outside the closed surface.
|
|
* Either 'points' or 'cellIds' can be set to nullptr if you don't want
|
|
* to receive that information. This method is currently only implemented
|
|
* in vtkOBBTree.
|
|
*/
|
|
virtual int IntersectWithLine(
|
|
const double p1[3], const double p2[3], vtkPoints* points, vtkIdList* cellIds);
|
|
|
|
/**
|
|
* Return the closest point and the cell which is closest to the point x.
|
|
* The closest point is somewhere on a cell, it need not be one of the
|
|
* vertices of the cell.
|
|
*/
|
|
virtual void FindClosestPoint(
|
|
const double x[3], double closestPoint[3], vtkIdType& cellId, int& subId, double& dist2);
|
|
|
|
/**
|
|
* Return the closest point and the cell which is closest to the point x.
|
|
* The closest point is somewhere on a cell, it need not be one of the
|
|
* vertices of the cell. This version takes in a vtkGenericCell
|
|
* to avoid allocating and deallocating the cell. This is much faster than
|
|
* the version which does not take a *cell, especially when this function is
|
|
* called many times in a row such as by a for loop, where the allocation and
|
|
* deallocation can be done only once outside the for loop. If a cell is
|
|
* found, "cell" contains the points and ptIds for the cell "cellId" upon
|
|
* exit.
|
|
*/
|
|
virtual void FindClosestPoint(const double x[3], double closestPoint[3], vtkGenericCell* cell,
|
|
vtkIdType& cellId, int& subId, double& dist2);
|
|
|
|
/**
|
|
* Return the closest point within a specified radius and the cell which is
|
|
* closest to the point x. The closest point is somewhere on a cell, it
|
|
* need not be one of the vertices of the cell. This method returns 1 if
|
|
* a point is found within the specified radius. If there are no cells within
|
|
* the specified radius, the method returns 0 and the values of closestPoint,
|
|
* cellId, subId, and dist2 are undefined.
|
|
*/
|
|
virtual vtkIdType FindClosestPointWithinRadius(double x[3], double radius, double closestPoint[3],
|
|
vtkIdType& cellId, int& subId, double& dist2);
|
|
|
|
/**
|
|
* Return the closest point within a specified radius and the cell which is
|
|
* closest to the point x. The closest point is somewhere on a cell, it
|
|
* need not be one of the vertices of the cell. This method returns 1 if a
|
|
* point is found within the specified radius. If there are no cells within
|
|
* the specified radius, the method returns 0 and the values of
|
|
* closestPoint, cellId, subId, and dist2 are undefined. This version takes
|
|
* in a vtkGenericCell to avoid allocating and deallocating the cell. This
|
|
* is much faster than the version which does not take a *cell, especially
|
|
* when this function is called many times in a row such as by a for loop,
|
|
* where the allocation and deallocation can be done only once outside the
|
|
* for loop. If a closest point is found, "cell" contains the points and
|
|
* ptIds for the cell "cellId" upon exit.
|
|
*/
|
|
virtual vtkIdType FindClosestPointWithinRadius(double x[3], double radius, double closestPoint[3],
|
|
vtkGenericCell* cell, vtkIdType& cellId, int& subId, double& dist2);
|
|
|
|
/**
|
|
* Return the closest point within a specified radius and the cell which is
|
|
* closest to the point x. The closest point is somewhere on a cell, it
|
|
* need not be one of the vertices of the cell. This method returns 1 if a
|
|
* point is found within the specified radius. If there are no cells within
|
|
* the specified radius, the method returns 0 and the values of
|
|
* closestPoint, cellId, subId, and dist2 are undefined. This version takes
|
|
* in a vtkGenericCell to avoid allocating and deallocating the cell. This
|
|
* is much faster than the version which does not take a *cell, especially
|
|
* when this function is called many times in a row such as by a for loop,
|
|
* where the allocation and dealloction can be done only once outside the
|
|
* for loop. If a closest point is found, "cell" contains the points and
|
|
* ptIds for the cell "cellId" upon exit. If a closest point is found,
|
|
* inside returns the return value of the EvaluatePosition call to the
|
|
* closest cell; inside(=1) or outside(=0).
|
|
*/
|
|
virtual vtkIdType FindClosestPointWithinRadius(double x[3], double radius, double closestPoint[3],
|
|
vtkGenericCell* cell, vtkIdType& cellId, int& subId, double& dist2, int& inside);
|
|
|
|
/**
|
|
* Return a list of unique cell ids inside of a given bounding box. The
|
|
* user must provide the vtkIdList to populate. This method returns data
|
|
* only after the locator has been built.
|
|
*/
|
|
virtual void FindCellsWithinBounds(double* bbox, vtkIdList* cells);
|
|
|
|
/**
|
|
* Given a finite line defined by the two points (p1,p2), return the list
|
|
* of unique cell ids in the buckets containing the line. It is possible
|
|
* that an empty cell list is returned. The user must provide the vtkIdList
|
|
* to populate. This method returns data only after the locator has been
|
|
* built.
|
|
*/
|
|
virtual void FindCellsAlongLine(
|
|
const double p1[3], const double p2[3], double tolerance, vtkIdList* cells);
|
|
|
|
/**
|
|
* Returns the Id of the cell containing the point,
|
|
* returns -1 if no cell found. This interface uses a tolerance of zero
|
|
*/
|
|
virtual vtkIdType FindCell(double x[3]);
|
|
|
|
/**
|
|
* Find the cell containing a given point. returns -1 if no cell found
|
|
* the cell parameters are copied into the supplied variables, a cell must
|
|
* be provided to store the information.
|
|
*/
|
|
virtual vtkIdType FindCell(
|
|
double x[3], double tol2, vtkGenericCell* GenCell, double pcoords[3], double* weights);
|
|
|
|
/**
|
|
* Quickly test if a point is inside the bounds of a particular cell.
|
|
* Some locators cache cell bounds and this function can make use
|
|
* of fast access to the data.
|
|
*/
|
|
virtual bool InsideCellBounds(double x[3], vtkIdType cell_ID);
|
|
|
|
protected:
|
|
vtkAbstractCellLocator();
|
|
~vtkAbstractCellLocator() override;
|
|
|
|
//@{
|
|
/**
|
|
* This command is used internally by the locator to copy
|
|
* all cell Bounds into the internal CellBounds array. Subsequent
|
|
* calls to InsideCellBounds(...) can make use of the data
|
|
* A valid dataset must be present for this to work. Returns true
|
|
* if bounds wre copied, false otherwise.
|
|
*/
|
|
virtual bool StoreCellBounds();
|
|
virtual void FreeCellBounds();
|
|
//@}
|
|
|
|
int NumberOfCellsPerNode;
|
|
vtkTypeBool RetainCellLists;
|
|
vtkTypeBool CacheCellBounds;
|
|
vtkTypeBool LazyEvaluation;
|
|
vtkTypeBool UseExistingSearchStructure;
|
|
vtkGenericCell* GenericCell;
|
|
double (*CellBounds)[6];
|
|
|
|
private:
|
|
vtkAbstractCellLocator(const vtkAbstractCellLocator&) = delete;
|
|
void operator=(const vtkAbstractCellLocator&) = delete;
|
|
};
|
|
|
|
#endif
|