VTK  9.7.20260805
vtkOBBTree.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
55
56#ifndef vtkOBBTree_h
57#define vtkOBBTree_h
58
60#include "vtkFiltersGeneralModule.h" // For export macro
61
62VTK_ABI_NAMESPACE_BEGIN
63class vtkMatrix4x4;
64
65// Special class defines node for the OBB tree
66class VTKFILTERSGENERAL_EXPORT vtkOBBNode
67{ //;prevent man page generation
68public:
71
72 double Corner[3]; // center point of this node
73 double Axes[3][3]; // the axes defining the OBB - ordered from long->short
74 vtkOBBNode* Parent; // parent node; nullptr if root
75 vtkOBBNode** Kids; // two children of this node; nullptr if leaf
76 vtkIdList* Cells; // list of cells in node
77 void DebugPrintTree(int level, double* leaf_vol, int* minCells, int* maxCells);
78
79private:
80 vtkOBBNode(const vtkOBBNode& other) = delete;
81 vtkOBBNode& operator=(const vtkOBBNode& rhs) = delete;
82};
83
84class VTKFILTERSGENERAL_EXPORT vtkOBBTree : public vtkAbstractCellLocator
85{
86public:
88
92 void PrintSelf(ostream& os, vtkIndent indent) override;
94
99 static vtkOBBTree* New();
100
101 // Reuse any superclass signatures that we don't override.
104
111 int IntersectWithLine(const double a0[3], const double a1[3], double tol, double& t, double x[3],
112 double pcoords[3], int& subId, vtkIdType& cellId, vtkGenericCell* cell) override;
113
125 int IntersectWithLine(const double p1[3], const double p2[3], double tol, vtkPoints* points,
126 vtkIdList* cellIds, vtkGenericCell* cell) override;
127
133 static void ComputeOBB(
134 vtkPoints* pts, double corner[3], double max[3], double mid[3], double min[3], double size[3]);
135
142 void ComputeOBB(vtkDataSet* input, double corner[3], double max[3], double mid[3], double min[3],
143 double size[3]);
144
150 int InsideOrOutside(const double point[3], double tol = 0);
151
157 vtkOBBNode* nodeA, vtkOBBNode* nodeB, vtkMatrix4x4* XformBtoA, double tol = 0);
158
162 int LineIntersectsNode(vtkOBBNode* pA, const double b0[3], const double b1[3], double tol = 0);
163
167 int TriangleIntersectsNode(vtkOBBNode* pA, double p0[3], double p1[3], double p2[3],
168 vtkMatrix4x4* XformBtoA, double tol = 0);
169
175 int (*function)(vtkOBBNode* nodeA, vtkOBBNode* nodeB, vtkMatrix4x4* Xform, void* arg),
176 void* data_arg, double tol = 0);
177
179
182 void FreeSearchStructure() override;
183 void BuildLocator() override;
184 void ForceBuildLocator() override;
186
196 void GenerateRepresentation(int level, vtkPolyData* pd) override;
197
198protected:
200 ~vtkOBBTree() override;
201
202 void BuildLocatorInternal() 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
225VTK_ABI_NAMESPACE_END
226#endif
void FindCellsAlongLine(const double p1[3], const double p2[3], double tol, vtkIdList *cells)
Take the passed line segment and intersect it with the data set.
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.
vtkAbstractCellLocator()
Find the cell containing a given point.
object to represent cell connectivity
abstract class to specify dataset behavior
Definition vtkDataSet.h:56
provides thread-safe access to cells
list of point or cell ids
Definition vtkIdList.h:26
a simple class to control print indentation
Definition vtkIndent.h:29
represent and manipulate 4x4 transformation matrices
double Axes[3][3]
Definition vtkOBBTree.h:73
vtkOBBNode * Parent
Definition vtkOBBTree.h:74
double Corner[3]
Definition vtkOBBTree.h:72
vtkIdList * Cells
Definition vtkOBBTree.h:76
void DebugPrintTree(int level, double *leaf_vol, int *minCells, int *maxCells)
vtkOBBNode ** Kids
Definition vtkOBBTree.h:75
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.
int LineIntersectsNode(vtkOBBNode *pA, const double b0[3], const double b1[3], double tol=0)
Returns true if line intersects node.
void BuildLocator() override
Satisfy locator's abstract interface, see vtkLocator.
int TriangleIntersectsNode(vtkOBBNode *pA, double p0[3], double p1[3], double p2[3], vtkMatrix4x4 *XformBtoA, double tol=0)
Returns true if triangle (optionally transformed) intersects node.
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...
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)
int IntersectWithLine(const double p1[3], const double p2[3], double tol, vtkPoints *points, vtkIdList *cellIds, vtkGenericCell *cell) 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, double tol=0)
For each intersecting leaf node pair, call function.
~vtkOBBTree() override
vtkOBBNode * Tree
Definition vtkOBBTree.h:210
void PrintSelf(ostream &os, vtkIndent indent) override
Standard methods to print and obtain type-related information.
void BuildLocatorInternal() override
This function is not pure virtual to maintain backwards compatibility.
int InsideOrOutside(const double point[3], double tol=0)
Determine whether a point is inside or outside the data used to build this OBB tree.
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 * InsertedPoints
Definition vtkOBBTree.h:213
void ForceBuildLocator() override
Satisfy locator's abstract interface, see vtkLocator.
int DisjointOBBNodes(vtkOBBNode *nodeA, vtkOBBNode *nodeB, vtkMatrix4x4 *XformBtoA, double tol=0)
Returns true if nodeB and nodeA are disjoint after optional transformation of nodeB with matrix Xform...
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:31
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition vtkPolyData.h:72
int vtkIdType
Definition vtkType.h:363
#define max(a, b)