1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
|
/*=========================================================================
Program: Visualization Toolkit
Module: vtkStaticPointLocator2D.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 vtkStaticPointLocator2D
* @brief quickly locate points in 2-space
*
* vtkStaticPointLocator2D is a spatial search object to quickly locate points
* in 2D. vtkStaticPointLocator2D works by dividing a specified region of
* space into a regular array of rectilinear buckets, and then keeping a
* list of points that lie in each bucket. Typical operation involves giving
* a position in 2D and finding the closest point; or finding the N closest
* points. (Note that the more general vtkStaticPointLocator is available
* for 3D operations.) Other specialized methods for 2D have also been provided.
*
* vtkStaticPointLocator2D is an accelerated version of vtkPointLocator. It is
* threaded (via vtkSMPTools), and supports one-time static construction
* (i.e., incremental point insertion is not supported). If you need to
* incrementally insert points, use the vtkPointLocator or its kin to do so.
*
* Note that to satisfy the superclass's API, methods often assume a 3D point
* is provided. However, only the x,y values are used for processing. The
* z-value is only used to define location of the 2D plane.
*
* @warning
* This class is templated. It may run slower than serial execution if the code
* is not optimized during compilation. Build in Release or ReleaseWithDebugInfo.
*
* @warning
* Make sure that you review the documentation for the superclasses
* vtkAbstactPointLocator and vtkLocator. In particular the Automatic
* data member can be used to automatically determine divisions based
* on the average number of points per bucket.
*
* @warning
* Other types of spatial locators have been developed such as octrees and
* kd-trees. These are often more efficient for the operations described
* here.
*
* @sa
* vtkStaticPointLocator vtkPointLocator vtkCellLocator vtkLocator
* vtkAbstractPointLocator
*/
#ifndef vtkStaticPointLocator2D_h
#define vtkStaticPointLocator2D_h
#include "vtkAbstractPointLocator.h"
#include "vtkCommonDataModelModule.h" // For export macro
class vtkIdList;
struct vtkBucketList2D;
class VTKCOMMONDATAMODEL_EXPORT vtkStaticPointLocator2D : public vtkAbstractPointLocator
{
public:
/**
* Construct with automatic computation of divisions, averaging
* 5 points per bucket.
*/
static vtkStaticPointLocator2D* New();
//@{
/**
* Standard type and print methods.
*/
vtkTypeMacro(vtkStaticPointLocator2D, vtkAbstractPointLocator);
void PrintSelf(ostream& os, vtkIndent indent) override;
//@}
//@{
/**
* Specify the average number of points in each bucket. This data member is
* used in conjunction with the Automatic data member (if enabled) to
* determine the number of locator x-y divisions.
*/
vtkSetClampMacro(NumberOfPointsPerBucket, int, 1, VTK_INT_MAX);
vtkGetMacro(NumberOfPointsPerBucket, int);
//@}
//@{
/**
* Set the number of divisions in x-y directions. If the Automatic data
* member is enabled, the Divisions are set according to the
* NumberOfPointsPerBucket and MaxNumberOfBuckets data members. The number
* of divisions must be >= 1 in each direction.
*/
vtkSetVector2Macro(Divisions, int);
vtkGetVectorMacro(Divisions, int, 2);
//@}
// Re-use any superclass signatures that we don't override.
using vtkAbstractPointLocator::FindClosestNPoints;
using vtkAbstractPointLocator::FindClosestPoint;
using vtkAbstractPointLocator::FindPointsWithinRadius;
using vtkAbstractPointLocator::GetBounds;
/**
* Given a position x, return the id of the point closest to it. An
* alternative method (defined in the superclass) requires separate x-y-z
* values. These methods are thread safe if BuildLocator() is directly or
* indirectly called from a single thread first. (Note in the 2D locator
* the z-value is ignored.)
*/
vtkIdType FindClosestPoint(const double x[3]) override;
//@{
/**
* Given a position x and a radius r, return the id of the point closest to
* the point within that radius. These methods are thread safe if
* BuildLocator() is directly or indirectly called from a single thread
* first. dist2 returns the squared distance to the point. Note that if multiple
* points are located the same distance away, the actual point returned is a
* function in which order the points are processed (i.e., indeterminate).
*/
vtkIdType FindClosestPointWithinRadius(double radius, const double x[3], double& dist2) override;
virtual vtkIdType FindClosestPointWithinRadius(
double radius, const double x[3], double inputDataLength, double& dist2);
//@}
/**
* Find the closest N points to a position. This returns the closest N
* points to a position. A faster method could be created that returned N
* close points to a position, but necessarily the exact N closest. The
* returned points are sorted from closest to farthest. These methods are
* thread safe if BuildLocator() is directly or indirectly called from a
* single thread first.
*/
void FindClosestNPoints(int N, const double x[3], vtkIdList* result) override;
/**
* Find all points within a specified radius R of position x.
* The result is not sorted in any specific manner.
* These methods are thread safe if BuildLocator() is directly or
* indirectly called from a single thread first.
*/
void FindPointsWithinRadius(double R, const double x[3], vtkIdList* result) override;
/**
* Intersect the points contained in the locator with the line defined by
* (a0,a1). Return the point within the tolerance tol that is closest to a0
* (tol measured in the world coordinate system). If an intersection occurs
* (i.e., the method returns nonzero), then the parametric location along
* the line t, the closest position along the line lineX, and the coordinates
* of the picked ptId is returned in ptX. (This method is thread safe after
* the locator is built.)
*/
int IntersectWithLine(double a0[3], double a1[3], double tol, double& t, double lineX[3],
double ptX[3], vtkIdType& ptId);
//@{
/**
* Special method for 2D operations (e.g., vtkVoronoi2D). The method
* returns the approximate number of points requested, returning the radius
* R of the furthest point, with the guarantee that all points are included
* that are closer than <=R.
*/
double FindCloseNBoundedPoints(int N, const double x[3], vtkIdList* result);
//@}
/**
* Merge points in the locator given a tolerance. Return a merge map which
* represents the mapping of "concident" point ids to a single point. Note
* the number of points in the merge map is the number of points the
* locator was built with. The user is expected to pass in an allocated
* mergeMap.
*/
void MergePoints(double tol, vtkIdType* mergeMap);
//@{
/**
* See vtkLocator and vtkAbstractPointLocator interface documentation.
* These methods are not thread safe.
*/
void Initialize() override;
void FreeSearchStructure() override;
void BuildLocator() override;
//@}
/**
* Given a bucket number bNum between 0 <= bNum < this->GetNumberOfBuckets(),
* return the number of points found in the bucket. Note that a bucket can
* also be specified with locator indices (i,j) which converts to a the
* bucket number bNum=i+this->Divisions[0]*j.
*/
vtkIdType GetNumberOfPointsInBucket(vtkIdType bNum);
/**
* Given a bucket number bNum between 0 <= bNum < this->GetNumberOfBuckets(),
* return a list of point ids contained within the bucket. The user must
* provide an instance of vtkIdList to contain the result.
*/
void GetBucketIds(vtkIdType bNum, vtkIdList* bList);
//@{
/**
* Set the maximum number of buckets in the locator. By default the value
* is set to VTK_INT_MAX. Note that there are significant performance
* implications at work here. If the number of buckets is set very large
* (meaning > VTK_INT_MAX) then internal sorting may be performed using
* 64-bit integers (which is much slower than using a 32-bit int). Of
* course, memory requirements may dramatically increase as well. It is
* recommended that the default value be used; but for extremely large data
* it may be desired to create a locator with an exceptionally large number
* of buckets. Note also that during initialization of the locator if the
* MaxNumberOfBuckets threshold is exceeded, the Divisions are scaled down
* in such a way as not to exceed the MaxNumberOfBuckets proportionally to
* the size of the bounding box in the x-y-z directions.
*/
vtkSetClampMacro(MaxNumberOfBuckets, vtkIdType, 1000, VTK_ID_MAX);
vtkGetMacro(MaxNumberOfBuckets, vtkIdType);
//@}
/**
* Inform the user as to whether large ids are being used. This flag only
* has meaning after the locator has been built. Large ids are used when the
* number of binned points, or the number of bins, is >= the maximum number
* of buckets (specified by the user). Note that LargeIds are only available
* on 64-bit architectures.
*/
bool GetLargeIds() { return this->LargeIds; }
//@{
/**
* Provide an accessor to the bounds. Valid after the locator is built.
*/
void GetBounds(double* bounds) override
{
bounds[0] = this->Bounds[0];
bounds[1] = this->Bounds[1];
bounds[2] = this->Bounds[2];
bounds[3] = this->Bounds[3];
}
//@}
//@{
/**
* Provide an accessor to the bucket spacing. Valid after the locator is
* built.
*/
virtual double* GetSpacing() { return this->H; }
virtual void GetSpacing(double spacing[3])
{
spacing[0] = this->H[0];
spacing[1] = this->H[1];
spacing[2] = 0.0;
}
//@}
//@{
/**
* Given a point x[3], return the locator index (i,j) which contains the
* point. This method is meant to be fast, so error checking is not
* performed. This method should only be called after the locator is built.
*/
void GetBucketIndices(const double* x, int ij[2]) const;
vtkIdType GetBucketIndex(const double* x) const;
//@}
/**
* Populate a polydata with the faces of the bins that potentially contain cells.
* Note that the level parameter has no effect on this method as there is no
* hierarchy built (i.e., uniform binning). Typically this is used for debugging.
*/
void GenerateRepresentation(int level, vtkPolyData* pd) override;
protected:
vtkStaticPointLocator2D();
~vtkStaticPointLocator2D() override;
int NumberOfPointsPerBucket; // Used with AutomaticOn to control subdivide
int Divisions[2]; // Number of sub-divisions in x-y directions
double H[2]; // Width of each bucket in x-y directions
vtkBucketList2D* Buckets; // Lists of point ids in each bucket
vtkIdType MaxNumberOfBuckets; // Maximum number of buckets in locator
bool LargeIds; // indicate whether integer ids are small or large
private:
vtkStaticPointLocator2D(const vtkStaticPointLocator2D&) = delete;
void operator=(const vtkStaticPointLocator2D&) = delete;
};
#endif
|