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.

131 lines
4.0 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkClosestPointStrategy.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 vtkClosestPointStrategy
* @brief implement a specific vtkPointSet::FindCell() strategy based
* on closest point
*
* vtkClosestPointStrategy is implements a FindCell() strategy based on
* locating the closest point in a dataset, and then searching the attached
* cells. While relatively fast, it does not always return the correct result
* (it may not find a cell, since the closest cell may not be connected to the
* closest point). vtkCellLocatorStrategy or vtkClosestNPointsStrategy will
* produce better results at the cost of speed.
*
* @sa
* vtkFindCellStrategy vtkPointSet vtkCellLocatorStrategy
* vtkClosestNPointsStrategy
*/
#ifndef vtkClosestPointStrategy_h
#define vtkClosestPointStrategy_h
#include "vtkCell.h" //inline SelectCell
#include "vtkCommonDataModelModule.h" // For export macro
#include "vtkFindCellStrategy.h"
#include "vtkGenericCell.h" //inline SelectCell
#include "vtkPointSet.h" //inline SelectCell
#include <set> // For tracking visited cells
class vtkIdList;
class vtkAbstractPointLocator;
class VTKCOMMONDATAMODEL_EXPORT vtkClosestPointStrategy : public vtkFindCellStrategy
{
public:
/**
* Construct a vtkFindCellStrategy subclass.
*/
static vtkClosestPointStrategy* New();
//@{
/**
* Standard methods for type information and printing.
*/
vtkTypeMacro(vtkClosestPointStrategy, vtkFindCellStrategy);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
/**
* Provide the necessary initialization method (see superclass for more
* information). This method sets up the point locator, vtkPointSet relationship.
* It will use the vtkPointSet's default locator if not defined by
* SetPointLocator() below.
*/
int Initialize(vtkPointSet* ps) override;
/**
* Implement the specific strategy. This method should only be called
* after the Initialize() method has been invoked.
*/
vtkIdType FindCell(double x[3], vtkCell* cell, vtkGenericCell* gencell, vtkIdType cellId,
double tol2, int& subId, double pcoords[3], double* weights) override;
//@{
/**
* Set / get an instance of vtkAbstractPointLocator which is used to
* implement the strategy for FindCell(). Note if a locator is not
* specified, then the default locator instantiated by the vtkPointSet
* provided in the Initialize() method is used.
*/
virtual void SetPointLocator(vtkAbstractPointLocator*);
vtkGetObjectMacro(PointLocator, vtkAbstractPointLocator);
//@}
/**
* Subclasses use this method to select the current cell.
*/
vtkCell* SelectCell(vtkPointSet* self, vtkIdType cellId, vtkCell* cell, vtkGenericCell* gencell);
protected:
vtkClosestPointStrategy();
~vtkClosestPointStrategy() override;
std::set<vtkIdType> VisitedCells;
vtkIdList* PointIds;
vtkIdList* Neighbors;
vtkIdList* CellIds;
vtkIdList* NearPointIds;
vtkAbstractPointLocator* PointLocator;
bool OwnsLocator; // was the locator specified? or taken from associated point set
private:
vtkClosestPointStrategy(const vtkClosestPointStrategy&) = delete;
void operator=(const vtkClosestPointStrategy&) = delete;
};
// Handle cases where starting cell is provided or not
inline vtkCell* vtkClosestPointStrategy::SelectCell(
vtkPointSet* self, vtkIdType cellId, vtkCell* cell, vtkGenericCell* gencell)
{
if (!cell)
{
if (gencell)
{
self->GetCell(cellId, gencell);
cell = gencell;
}
else
{
cell = self->GetCell(cellId);
}
}
return cell;
}
#endif