VTK  9.1.0
vtkOBBTree.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkOBBTree.h
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14=========================================================================*/
62#ifndef vtkOBBTree_h
63#define vtkOBBTree_h
64
66#include "vtkFiltersGeneralModule.h" // For export macro
67
68class vtkMatrix4x4;
69
70// Special class defines node for the OBB tree
71//
72
73//
74class VTKFILTERSGENERAL_EXPORT vtkOBBNode
75{ //;prevent man page generation
76public:
79
80 double Corner[3]; // center point of this node
81 double Axes[3][3]; // the axes defining the OBB - ordered from long->short
82 vtkOBBNode* Parent; // parent node; nullptr if root
83 vtkOBBNode** Kids; // two children of this node; nullptr if leaf
84 vtkIdList* Cells; // list of cells in node
85 void DebugPrintTree(int level, double* leaf_vol, int* minCells, int* maxCells);
86
87private:
88 vtkOBBNode(const vtkOBBNode& other) = delete;
89 vtkOBBNode& operator=(const vtkOBBNode& rhs) = delete;
90};
91
92//
93
94class VTKFILTERSGENERAL_EXPORT vtkOBBTree : public vtkAbstractCellLocator
95{
96public:
98 void PrintSelf(ostream& os, vtkIndent indent) override;
99
104 static vtkOBBTree* New();
105
106 // Re-use any superclass signatures that we don't override.
108
121 const double a0[3], const double a1[3], vtkPoints* points, vtkIdList* cellIds) override;
122
129 int IntersectWithLine(const double a0[3], const double a1[3], double tol, double& t, double x[3],
130 double pcoords[3], int& subId, vtkIdType& cellId, vtkGenericCell* cell) override;
131
137 static void ComputeOBB(
138 vtkPoints* pts, double corner[3], double max[3], double mid[3], double min[3], double size[3]);
139
146 void ComputeOBB(vtkDataSet* input, double corner[3], double max[3], double mid[3], double min[3],
147 double size[3]);
148
154 int InsideOrOutside(const double point[3]);
155
160 int DisjointOBBNodes(vtkOBBNode* nodeA, vtkOBBNode* nodeB, vtkMatrix4x4* XformBtoA);
161
165 int LineIntersectsNode(vtkOBBNode* pA, const double b0[3], const double b1[3]);
166
171 vtkOBBNode* pA, double p0[3], double p1[3], double p2[3], vtkMatrix4x4* XformBtoA);
172
178 int (*function)(vtkOBBNode* nodeA, vtkOBBNode* nodeB, vtkMatrix4x4* Xform, void* arg),
179 void* data_arg);
180
182
185 void FreeSearchStructure() override;
186 void BuildLocator() override;
188
198 void GenerateRepresentation(int level, vtkPolyData* pd) override;
199
200protected:
202 ~vtkOBBTree() override;
203
204 // Compute an OBB from the list of cells given. This used to be
205 // public but should not have been. A public call has been added
206 // so that the functionality can be accessed.
207 void ComputeOBB(vtkIdList* cells, double corner[3], double max[3], double mid[3], double min[3],
208 double size[3]);
209
211 void BuildTree(vtkIdList* cells, vtkOBBNode* parent, int level);
215
216 void DeleteTree(vtkOBBNode* OBBptr);
218 vtkOBBNode* OBBptr, int level, int repLevel, vtkPoints* pts, vtkCellArray* polys);
219
220private:
221 vtkOBBTree(const vtkOBBTree&) = delete;
222 void operator=(const vtkOBBTree&) = delete;
223};
224
225#endif
an abstract base class for locators which find cells
virtual int IntersectWithLine(const double p1[3], const double p2[3], double tol, double &t, double x[3], double pcoords[3], int &subId)
Return intersection point (if any) of finite line with cells contained in cell locator.
object to represent cell connectivity
Definition: vtkCellArray.h:190
abstract class to specify dataset behavior
Definition: vtkDataSet.h:66
provides thread-safe access to cells
list of point or cell ids
Definition: vtkIdList.h:40
a simple class to control print indentation
Definition: vtkIndent.h:43
represent and manipulate 4x4 transformation matrices
Definition: vtkMatrix4x4.h:45
vtkOBBNode * Parent
Definition: vtkOBBTree.h:82
vtkIdList * Cells
Definition: vtkOBBTree.h:84
void DebugPrintTree(int level, double *leaf_vol, int *minCells, int *maxCells)
vtkOBBNode ** Kids
Definition: vtkOBBTree.h:83
generate oriented bounding box (OBB) tree
Definition: vtkOBBTree.h:95
void ComputeOBB(vtkDataSet *input, double corner[3], double max[3], double mid[3], double min[3], double size[3])
Compute an OBB for the input dataset using the cells in the data.
void BuildLocator() override
Satisfy locator's abstract interface, see vtkLocator.
void FreeSearchStructure() override
Satisfy locator's abstract interface, see vtkLocator.
int IntersectWithLine(const double a0[3], const double a1[3], double tol, double &t, double x[3], double pcoords[3], int &subId, vtkIdType &cellId, vtkGenericCell *cell) override
Return the first intersection of the specified line segment with the OBB tree, as well as information...
int DisjointOBBNodes(vtkOBBNode *nodeA, vtkOBBNode *nodeB, vtkMatrix4x4 *XformBtoA)
Returns true if nodeB and nodeA are disjoint after optional transformation of nodeB with matrix Xform...
int InsideOrOutside(const double point[3])
Determine whether a point is inside or outside the data used to build this OBB tree.
void GenerateRepresentation(int level, vtkPolyData *pd) override
Create polygonal representation for OBB tree at specified level.
void GeneratePolygons(vtkOBBNode *OBBptr, int level, int repLevel, vtkPoints *pts, vtkCellArray *polys)
~vtkOBBTree() override
vtkOBBNode * Tree
Definition: vtkOBBTree.h:210
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
int LineIntersectsNode(vtkOBBNode *pA, const double b0[3], const double b1[3])
Returns true if line intersects node.
static vtkOBBTree * New()
Construct with automatic computation of divisions, averaging 25 cells per octant.
void ComputeOBB(vtkIdList *cells, double corner[3], double max[3], double mid[3], double min[3], double size[3])
vtkPoints * PointsList
Definition: vtkOBBTree.h:212
int IntersectWithLine(const double a0[3], const double a1[3], vtkPoints *points, vtkIdList *cellIds) override
Take the passed line segment and intersect it with the data set.
int IntersectWithOBBTree(vtkOBBTree *OBBTreeB, vtkMatrix4x4 *XformBtoA, int(*function)(vtkOBBNode *nodeA, vtkOBBNode *nodeB, vtkMatrix4x4 *Xform, void *arg), void *data_arg)
For each intersecting leaf node pair, call function.
int TriangleIntersectsNode(vtkOBBNode *pA, double p0[3], double p1[3], double p2[3], vtkMatrix4x4 *XformBtoA)
Returns true if triangle (optionally transformed) intersects node.
int OBBCount
Definition: vtkOBBTree.h:214
int * InsertedPoints
Definition: vtkOBBTree.h:213
void DeleteTree(vtkOBBNode *OBBptr)
static void ComputeOBB(vtkPoints *pts, double corner[3], double max[3], double mid[3], double min[3], double size[3])
Compute an OBB from the list of points given.
void BuildTree(vtkIdList *cells, vtkOBBNode *parent, int level)
represent and manipulate 3D points
Definition: vtkPoints.h:43
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition: vtkPolyData.h:95
@ point
Definition: vtkX3D.h:242
@ points
Definition: vtkX3D.h:452
@ level
Definition: vtkX3D.h:401
@ function
Definition: vtkX3D.h:255
@ size
Definition: vtkX3D.h:259
int vtkIdType
Definition: vtkType.h:332
#define max(a, b)