forked from Kitware/VTK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vtkBSPIntersections.h
209 lines (162 loc) · 6.18 KB
/
vtkBSPIntersections.h
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
/*=========================================================================
Program: Visualization Toolkit
Module: vtkBSPIntersections.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.
=========================================================================*/
/*----------------------------------------------------------------------------
Copyright (c) Sandia Corporation
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
----------------------------------------------------------------------------*/
/**
* @class vtkBSPIntersections
* @brief Perform calculations (mostly intersection
* calculations) on regions of a 3D binary spatial partitioning.
*
*
* Given an axis aligned binary spatial partitioning described by a
* vtkBSPCuts object, perform intersection queries on various
* geometric entities with regions of the spatial partitioning.
*
* @sa
* vtkBSPCuts vtkKdTree
*/
#ifndef vtkBSPIntersections_h
#define vtkBSPIntersections_h
#include "vtkCommonDataModelModule.h" // For export macro
#include "vtkObject.h"
class vtkTimeStamp;
class vtkCell;
class vtkKdNode;
class vtkBSPCuts;
class VTKCOMMONDATAMODEL_EXPORT vtkBSPIntersections : public vtkObject
{
public:
vtkTypeMacro(vtkBSPIntersections, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
static vtkBSPIntersections *New();
/**
* Define the binary spatial partitioning.
*/
void SetCuts(vtkBSPCuts *cuts);
vtkGetObjectMacro(Cuts, vtkBSPCuts);
/**
* Get the bounds of the whole space (xmin, xmax, ymin, ymax, zmin, zmax)
* Return 0 if OK, 1 on error.
*/
int GetBounds(double *bounds);
/**
* The number of regions in the binary spatial partitioning
*/
int GetNumberOfRegions();
/**
* Get the spatial bounds of a particular region
* Return 0 if OK, 1 on error.
*/
int GetRegionBounds(int regionID, double bounds[6]);
/**
* Get the bounds of the data within the k-d tree region, possibly
* smaller than the bounds of the region.
* Return 0 if OK, 1 on error.
*/
int GetRegionDataBounds(int regionID, double bounds[6]);
//@{
/**
* Determine whether a region of the spatial decomposition
* intersects an axis aligned box.
*/
int IntersectsBox(int regionId, double *x);
int IntersectsBox(int regionId, double xmin, double xmax,
double ymin, double ymax,
double zmin, double zmax);
//@}
//@{
/**
* Compute a list of the Ids of all regions that
* intersect the specified axis aligned box.
* Returns: the number of ids in the list.
*/
int IntersectsBox(int *ids, int len, double *x);
int IntersectsBox(int *ids, int len, double x0, double x1,
double y0, double y1, double z0, double z1);
//@}
/**
* Determine whether a region of the spatial decomposition
* intersects a sphere, given the center of the sphere
* and the square of it's radius.
*/
int IntersectsSphere2(int regionId,
double x, double y, double z, double rSquared);
/**
* Compute a list of the Ids of all regions that
* intersect the specified sphere. The sphere is given
* by it's center and the square of it's radius.
* Returns: the number of ids in the list.
*/
int IntersectsSphere2(int *ids, int len,
double x, double y, double z, double rSquared);
/**
* Determine whether a region of the spatial decomposition
* intersects the given cell. If you already
* know the region that the cell centroid lies in, provide
* that as the last argument to make the computation quicker.
*/
int IntersectsCell(int regionId, vtkCell *cell, int cellRegion=-1);
/**
* Compute a list of the Ids of all regions that
* intersect the given cell. If you already
* know the region that the cell centroid lies in, provide
* that as the last argument to make the computation quicker.
* Returns the number of regions the cell intersects.
*/
int IntersectsCell(int *ids, int len, vtkCell *cell, int cellRegion=-1);
/**
* When computing the intersection of k-d tree regions with other
* objects, we use the spatial bounds of the region. To use the
* tighter bound of the bounding box of the data within the region,
* set this variable ON. (Specifying data bounds in the vtkBSPCuts
* object is optional. If data bounds were not specified, this
* option has no meaning.)
*/
vtkGetMacro(ComputeIntersectionsUsingDataBounds, int);
void SetComputeIntersectionsUsingDataBounds(int c);
void ComputeIntersectionsUsingDataBoundsOn();
void ComputeIntersectionsUsingDataBoundsOff();
protected:
vtkBSPIntersections();
~vtkBSPIntersections() override;
vtkGetMacro(RegionListBuildTime, vtkMTimeType);
int BuildRegionList();
vtkKdNode **GetRegionList(){return this->RegionList;}
double CellBoundsCache[6]; // to speed cell intersection queries
enum {
XDIM = 0, // don't change these values
YDIM = 1,
ZDIM = 2
};
private:
static int NumberOfLeafNodes(vtkKdNode *kd);
static void SetIDRanges(vtkKdNode *kd, int &min, int &max);
int SelfRegister(vtkKdNode *kd);
static void SetCellBounds(vtkCell *cell, double *bounds);
int _IntersectsBox(vtkKdNode *node, int *ids, int len,
double x0, double x1,
double y0, double y1,
double z0, double z1);
int _IntersectsSphere2(vtkKdNode *node, int *ids, int len,
double x, double y, double z, double rSquared);
int _IntersectsCell(vtkKdNode *node, int *ids, int len,
vtkCell *cell, int cellRegion=-1);
vtkBSPCuts *Cuts;
int NumberOfRegions;
vtkKdNode **RegionList;
vtkTimeStamp RegionListBuildTime;
int ComputeIntersectionsUsingDataBounds;
vtkBSPIntersections(const vtkBSPIntersections&) = delete;
void operator=(const vtkBSPIntersections&) = delete;
};
#endif