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.

247 lines
7.8 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkPointSet.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 vtkPointSet
* @brief abstract class for specifying dataset behavior
*
* vtkPointSet is an abstract class that specifies the interface for
* datasets that explicitly use "point" arrays to represent geometry.
* For example, vtkPolyData, vtkUnstructuredGrid, and vtkStructuredGrid
* require point arrays to specify point positions, while vtkImageData
* represents point positions implicitly (and hence is not a subclass
* of vtkImageData).
*
* Note: The vtkPolyData and vtkUnstructuredGrid datasets (derived classes of
* vtkPointSet) are often used in geometric computation (e.g.,
* vtkDelaunay2D). In most cases during filter execution the output geometry
* and/or topology is created once and provided as output; however in a very
* few cases the underlying geometry/topology may be created and then
* incrementally modified. This has implications on the use of supporting
* classes like locators and cell links topological structures which may be
* required to support incremental editing operations. Consequently, there is
* a flag, Editable, that controls whether the dataset can be incrementally
* edited after it is initially created. By default, and for performance
* reasons, vtkPointSet derived classes are created as non-editable. The few
* methods that require incremental editing capabilities are documented in
* derived classes.
*
* Another important feature of vtkPointSet classes is the use of an internal
* locator to speed up certain operations like FindCell(). Depending on the
* application and desired performance, different locators (either a cell or
* point locator) of different locator types may be used, along with different
* strategies for using the locators to perform various operations. See
* the class vtkFindCellStrategy for more information
*
* @sa
* vtkPolyData vtkStructuredGrid vtkUnstructuredGrid vtkFindCellStrategy
*/
#ifndef vtkPointSet_h
#define vtkPointSet_h
#include "vtkCommonDataModelModule.h" // For export macro
#include "vtkDataSet.h"
#include "vtkPoints.h" // Needed for inline methods
class vtkAbstractPointLocator;
class vtkAbstractCellLocator;
class VTKCOMMONDATAMODEL_EXPORT vtkPointSet : public vtkDataSet
{
public:
//@{
/**
* Standard methdos for type information and printing.
*/
vtkTypeMacro(vtkPointSet, vtkDataSet);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@{
/**
* Specify whether this dataset is editable after creation. Meaning, once
* the points and cells are defined, can the dataset be incrementally
* modified. By default, this dataset is non-editable (i.e., "static")
* after construction. The reason for this is performance: cell links and
* locators can be built (and destroyed) much faster is it is known that
* the data is static (see vtkStaticCellLinks, vtkStaticPointLocator,
* vtkStaticCellLocator).
*/
vtkSetMacro(Editable, bool);
vtkGetMacro(Editable, bool);
vtkBooleanMacro(Editable, bool);
//@}
/**
* Reset to an empty state and free any memory.
*/
void Initialize() override;
/**
* Copy the geometric structure of an input point set object.
*/
void CopyStructure(vtkDataSet* pd) override;
//@{
/**
* See vtkDataSet for additional information.
*/
vtkIdType GetNumberOfPoints() override;
void GetPoint(vtkIdType ptId, double x[3]) override { this->Points->GetPoint(ptId, x); }
vtkIdType FindPoint(double x[3]) override;
vtkIdType FindPoint(double x, double y, double z) { return this->vtkDataSet::FindPoint(x, y, z); }
vtkIdType FindCell(double x[3], vtkCell* cell, vtkIdType cellId, double tol2, int& subId,
double pcoords[3], double* weights) override;
vtkIdType FindCell(double x[3], vtkCell* cell, vtkGenericCell* gencell, vtkIdType cellId,
double tol2, int& subId, double pcoords[3], double* weights) override;
//@}
/**
* See vtkDataSet for additional information.
* WARNING: Just don't use this error-prone method, the returned pointer
* and its values are only valid as long as another method invocation is not
* performed. Prefer GetPoint() with the return value in argument.
*/
double* GetPoint(vtkIdType ptId) VTK_SIZEHINT(3) override { return this->Points->GetPoint(ptId); }
/**
* Return an iterator that traverses the cells in this data set.
*/
vtkCellIterator* NewCellIterator() override;
//@{
/**
* Build the internal point locator . In a multi-threaded environment, call
* this method in a single thread before using FindCell() or FindPoint().
*/
void BuildPointLocator();
void BuildLocator() { this->BuildPointLocator(); }
//@}
/**
* Build the cell locator. In a multi-threaded environment,
* call this method in a single thread before using FindCell().
*/
void BuildCellLocator();
//@{
/**
* Set / get an instance of vtkAbstractPointLocator which is used to
* support the FindPoint() and FindCell() methods. By default a
* vtkStaticPointLocator is used, unless the class is set as Editable, in
* which case a vtkPointLocator is used.
*/
virtual void SetPointLocator(vtkAbstractPointLocator*);
vtkGetObjectMacro(PointLocator, vtkAbstractPointLocator);
//@}
//@{
/**
* Set / get an instance of vtkAbstractCellLocator which may be used
* when a vtkCellLocatorStrategy is used during a FindCelloperation.
*/
virtual void SetCellLocator(vtkAbstractCellLocator*);
vtkGetObjectMacro(CellLocator, vtkAbstractCellLocator);
//@}
/**
* Get MTime which also considers its vtkPoints MTime.
*/
vtkMTimeType GetMTime() override;
/**
* Compute the (X, Y, Z) bounds of the data.
*/
void ComputeBounds() override;
/**
* Reclaim any unused memory.
*/
void Squeeze() override;
//@{
/**
* Specify point array to define point coordinates.
*/
virtual void SetPoints(vtkPoints*);
vtkGetObjectMacro(Points, vtkPoints);
//@}
/**
* Return the actual size of the data in kibibytes (1024 bytes). This number
* is valid only after the pipeline has updated. The memory size
* returned is guaranteed to be greater than or equal to the
* memory required to represent the data (e.g., extra space in
* arrays, etc. are not included in the return value). THIS METHOD
* IS THREAD SAFE.
*/
unsigned long GetActualMemorySize() override;
//@{
/**
* Shallow and Deep copy.
*/
void ShallowCopy(vtkDataObject* src) override;
void DeepCopy(vtkDataObject* src) override;
//@}
//@{
/**
* Overwritten to handle the data/locator loop
*/
void Register(vtkObjectBase* o) override;
void UnRegister(vtkObjectBase* o) override;
//@}
//@{
/**
* Retrieve an instance of this class from an information object.
*/
static vtkPointSet* GetData(vtkInformation* info);
static vtkPointSet* GetData(vtkInformationVector* v, int i = 0);
//@}
protected:
vtkPointSet();
~vtkPointSet() override;
bool Editable;
vtkPoints* Points;
vtkAbstractPointLocator* PointLocator;
vtkAbstractCellLocator* CellLocator;
void ReportReferences(vtkGarbageCollector*) override;
private:
void Cleanup();
vtkPointSet(const vtkPointSet&) = delete;
void operator=(const vtkPointSet&) = delete;
};
inline vtkIdType vtkPointSet::GetNumberOfPoints()
{
if (this->Points)
{
return this->Points->GetNumberOfPoints();
}
else
{
return 0;
}
}
#endif