You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
5.8 KiB
156 lines
5.8 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkLocator.h,v $
|
|
|
|
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.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkLocator - abstract base class for objects that accelerate spatial searches
|
|
// .SECTION Description
|
|
// vtkLocator is an abstract base class for spatial search objects, or
|
|
// locators. The principle behind locators is that they divide 3-space into
|
|
// small pieces (or "buckets") that can be quickly found in response to
|
|
// queries like point location, line intersection, or object-object
|
|
// intersection.
|
|
//
|
|
// The purpose of this base class is to provide ivars 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 tree. 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.
|
|
|
|
// .SECTION See Also
|
|
// vtkPointLocator vtkCellLocator vtkOBBTree vtkMergePoints
|
|
|
|
#ifndef __vtkLocator_h
|
|
#define __vtkLocator_h
|
|
|
|
#include "vtkObject.h"
|
|
|
|
class vtkDataSet;
|
|
class vtkPolyData;
|
|
|
|
class VTK_FILTERING_EXPORT vtkLocator : public vtkObject
|
|
{
|
|
public:
|
|
vtkTypeRevisionMacro(vtkLocator,vtkObject);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Build the locator from the points/cells defining this dataset.
|
|
virtual void SetDataSet(vtkDataSet*);
|
|
vtkGetObjectMacro(DataSet,vtkDataSet);
|
|
|
|
// Description:
|
|
// Set the maximum allowable level for the tree. If the Automatic ivar is
|
|
// off, this will be the target depth of the locator.
|
|
vtkSetClampMacro(MaxLevel,int,0,VTK_LARGE_INTEGER);
|
|
vtkGetMacro(MaxLevel,int);
|
|
|
|
// Description:
|
|
// 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.
|
|
vtkGetMacro(Level,int);
|
|
|
|
// Description:
|
|
// 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,int);
|
|
vtkGetMacro(Automatic,int);
|
|
vtkBooleanMacro(Automatic,int);
|
|
|
|
// Description:
|
|
// Specify absolute tolerance (in world coordinates) for performing
|
|
// geometric operations.
|
|
vtkSetClampMacro(Tolerance,double,0.0,VTK_DOUBLE_MAX);
|
|
vtkGetMacro(Tolerance,double);
|
|
|
|
// Description:
|
|
// Boolean controls whether to maintain list of entities in each bucket.
|
|
// Normally the lists are maintained, but if the locator is being used
|
|
// as a geometry simplification technique, there is no need to keep them.
|
|
vtkSetMacro(RetainCellLists,int);
|
|
vtkGetMacro(RetainCellLists,int);
|
|
vtkBooleanMacro(RetainCellLists,int);
|
|
|
|
// Description:
|
|
// Cause the locator to rebuild itself if it or its input dataset has
|
|
// changed.
|
|
virtual void Update();
|
|
|
|
// Description:
|
|
// Initialize locator. Frees memory and resets object as appropriate.
|
|
virtual void Initialize();
|
|
|
|
// Description:
|
|
// Build the locator from the input dataset.
|
|
virtual void BuildLocator() = 0;
|
|
|
|
// Description:
|
|
// Free the memory required for the spatial data structure.
|
|
virtual void FreeSearchStructure() = 0;
|
|
|
|
// Description:
|
|
// 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;
|
|
|
|
// Description:
|
|
// Return the time of the last data structure build.
|
|
vtkGetMacro(BuildTime, unsigned long);
|
|
|
|
// Description:
|
|
// Handle the PointSet <-> Locator loop.
|
|
virtual void Register(vtkObjectBase *o);
|
|
virtual void UnRegister(vtkObjectBase *o);
|
|
protected:
|
|
vtkLocator();
|
|
~vtkLocator();
|
|
|
|
vtkDataSet *DataSet;
|
|
int Automatic; // boolean controls automatic subdivision (or uses user spec.)
|
|
double Tolerance; // for performing merging
|
|
int MaxLevel;
|
|
int Level;
|
|
int RetainCellLists;
|
|
|
|
vtkTimeStamp BuildTime; // time at which locator was built
|
|
|
|
virtual void ReportReferences(vtkGarbageCollector*);
|
|
private:
|
|
vtkLocator(const vtkLocator&); // Not implemented.
|
|
void operator=(const vtkLocator&); // Not implemented.
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|