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.
192 lines
6.0 KiB
C
192 lines
6.0 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkLocator.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 vtkLocator
|
||
|
* @brief abstract base class for objects that accelerate spatial searches
|
||
|
*
|
||
|
* vtkLocator is an abstract base class for spatial search objects, or
|
||
|
* locators. The principle behind locators is that they divide 3-space into
|
||
|
* small regions (or "buckets") that can be quickly found in response to
|
||
|
* queries about point location, line intersection, or object-object
|
||
|
* intersection.
|
||
|
*
|
||
|
* The purpose of this base class is to provide data members and methods
|
||
|
* shared by all locators. The GenerateRepresentation() is one such
|
||
|
* interesting method. This method works in conjunction with
|
||
|
* vtkLocatorFilter to create polygonal representations for the locator. For
|
||
|
* example, if the locator is an OBB tree (i.e., vtkOBBTree.h), then the
|
||
|
* representation is a set of one or more oriented bounding boxes, depending
|
||
|
* upon the specified level.
|
||
|
*
|
||
|
* Locators typically work as follows. One or more "entities", such as points
|
||
|
* or cells, are inserted into the locator structure. These entities are
|
||
|
* associated with one or more buckets. Then, when performing geometric
|
||
|
* operations, the operations are performed first on the buckets, and then if
|
||
|
* the operation tests positive, then on the entities in the bucket. For
|
||
|
* example, during collision tests, the locators are collided first to
|
||
|
* identify intersecting buckets. If an intersection is found, more expensive
|
||
|
* operations are then carried out on the entities in the bucket.
|
||
|
*
|
||
|
* To obtain good performance, locators are often organized in a tree
|
||
|
* structure. In such a structure, there are frequently multiple "levels"
|
||
|
* corresponding to different nodes in the tree. So the word level (in the
|
||
|
* context of the locator) can be used to specify a particular representation
|
||
|
* in the tree. For example, in an octree (which is a tree with 8 children),
|
||
|
* level 0 is the bounding box, or root octant, and level 1 consists of its
|
||
|
* eight children.
|
||
|
*
|
||
|
* @warning
|
||
|
* There is a concept of static and incremental locators. Static locators are
|
||
|
* constructed one time, and then support appropriate queries. Incremental
|
||
|
* locators may have data inserted into them over time (e.g., adding new
|
||
|
* points during the process of isocontouring).
|
||
|
*
|
||
|
* @sa
|
||
|
* vtkPointLocator vtkCellLocator vtkOBBTree vtkMergePoints
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkLocator_h
|
||
|
#define vtkLocator_h
|
||
|
|
||
|
#include "vtkCommonDataModelModule.h" // For export macro
|
||
|
#include "vtkObject.h"
|
||
|
|
||
|
class vtkDataSet;
|
||
|
class vtkPolyData;
|
||
|
|
||
|
class VTKCOMMONDATAMODEL_EXPORT vtkLocator : public vtkObject
|
||
|
{
|
||
|
public:
|
||
|
//@{
|
||
|
/**
|
||
|
* Standard type and print methods.
|
||
|
*/
|
||
|
vtkTypeMacro(vtkLocator, vtkObject);
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Build the locator from the points/cells defining this dataset.
|
||
|
*/
|
||
|
virtual void SetDataSet(vtkDataSet*);
|
||
|
vtkGetObjectMacro(DataSet, vtkDataSet);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the maximum allowable level for the tree. If the Automatic ivar is
|
||
|
* off, this will be the target depth of the locator.
|
||
|
* Initial value is 8.
|
||
|
*/
|
||
|
vtkSetClampMacro(MaxLevel, int, 0, VTK_INT_MAX);
|
||
|
vtkGetMacro(MaxLevel, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Get the level of the locator (determined automatically if Automatic is
|
||
|
* true). The value of this ivar may change each time the locator is built.
|
||
|
* Initial value is 8.
|
||
|
*/
|
||
|
vtkGetMacro(Level, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Boolean controls whether locator depth/resolution of locator is computed
|
||
|
* automatically from average number of entities in bucket. If not set,
|
||
|
* there will be an explicit method to control the construction of the
|
||
|
* locator (found in the subclass).
|
||
|
*/
|
||
|
vtkSetMacro(Automatic, vtkTypeBool);
|
||
|
vtkGetMacro(Automatic, vtkTypeBool);
|
||
|
vtkBooleanMacro(Automatic, vtkTypeBool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Specify absolute tolerance (in world coordinates) for performing
|
||
|
* geometric operations.
|
||
|
*/
|
||
|
vtkSetClampMacro(Tolerance, double, 0.0, VTK_DOUBLE_MAX);
|
||
|
vtkGetMacro(Tolerance, double);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Cause the locator to rebuild itself if it or its input dataset has
|
||
|
* changed.
|
||
|
*/
|
||
|
virtual void Update();
|
||
|
|
||
|
/**
|
||
|
* Initialize locator. Frees memory and resets object as appropriate.
|
||
|
*/
|
||
|
virtual void Initialize();
|
||
|
|
||
|
/**
|
||
|
* Build the locator from the input dataset.
|
||
|
*/
|
||
|
virtual void BuildLocator() = 0;
|
||
|
|
||
|
/**
|
||
|
* Free the memory required for the spatial data structure.
|
||
|
*/
|
||
|
virtual void FreeSearchStructure() = 0;
|
||
|
|
||
|
/**
|
||
|
* Method to build a representation at a particular level. Note that the
|
||
|
* method GetLevel() returns the maximum number of levels available for
|
||
|
* the tree. You must provide a vtkPolyData object into which to place the
|
||
|
* data.
|
||
|
*/
|
||
|
virtual void GenerateRepresentation(int level, vtkPolyData* pd) = 0;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Return the time of the last data structure build.
|
||
|
*/
|
||
|
vtkGetMacro(BuildTime, vtkMTimeType);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Handle the PointSet <-> Locator loop.
|
||
|
*/
|
||
|
void Register(vtkObjectBase* o) override;
|
||
|
void UnRegister(vtkObjectBase* o) override;
|
||
|
//@}
|
||
|
|
||
|
protected:
|
||
|
vtkLocator();
|
||
|
~vtkLocator() override;
|
||
|
|
||
|
vtkDataSet* DataSet;
|
||
|
vtkTypeBool Automatic; // boolean controls automatic subdivision (or uses user spec.)
|
||
|
double Tolerance; // for performing merging
|
||
|
int MaxLevel;
|
||
|
int Level;
|
||
|
|
||
|
vtkTimeStamp BuildTime; // time at which locator was built
|
||
|
|
||
|
void ReportReferences(vtkGarbageCollector*) override;
|
||
|
|
||
|
private:
|
||
|
vtkLocator(const vtkLocator&) = delete;
|
||
|
void operator=(const vtkLocator&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif
|