Tulip  5.4.0
Large graphs analysis and drawing
BoundingBox.h
1 /*
2  *
3  * This file is part of Tulip (http://tulip.labri.fr)
4  *
5  * Authors: David Auber and the Tulip development Team
6  * from LaBRI, University of Bordeaux
7  *
8  * Tulip is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License
10  * as published by the Free Software Foundation, either version 3
11  * of the License, or (at your option) any later version.
12  *
13  * Tulip is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16  * See the GNU General Public License for more details.
17  *
18  */
19 
20 #ifndef Tulip_BOUNDINGBOX_H
21 #define Tulip_BOUNDINGBOX_H
22 
23 #include <cassert>
24 #include <vector>
25 #include <tulip/Vector.h>
26 #include <tulip/tulipconf.h>
27 
28 namespace tlp {
29 /**
30  * \ingroup Structures
31  * \brief This class represents the 3D bounding box of an object.
32  * It is mostly used to determine whether or not two object are in a state of collision.
33  *
34  * It is defined by two 3d points, the first one (A) being the lowest point, the second (B) being
35  the highest.
36  * As a bounding box is a mathematical entity describing the lowest and highest points, whether
37  these points are in the top-left corner or
38  * lower-right corner depends on the axes we use.
39  * Below is a crude ASCII-art description of the axes we use in our 3D world and the points where
40  the min and max are thus positioned.
41  * Through the rest of this class's documentation, it will be assumed that this is the convention.
42  *
43  *
44  * @verbatim
45  y
46  |
47  |
48  |_____ x
49  /
50  /
51  z
52 
53  _________ B
54  / /|
55  / / |
56  /________/ |
57  | | |
58  | | |
59  | | /
60  |________|/
61  A
62 
63  @endverbatim
64  *
65  *
66  */
67 struct TLP_SCOPE BoundingBox : public Array<Vec3f, 2> {
68 
69  /**
70  * @brief Creates an invalid boundig box.
71  * The minimum is (1, 1, 1) and the maximum is (-1, -1, -1).
72  *
73  **/
74  BoundingBox();
75 
76  /**
77  * @brief Creates a bounding box that must be valid.
78  * Validity is checked in debug mode by an assert.
79  *
80  * @param min The lower left closest point of the box.
81  * @param max The higher right most farther point of the box.
82  * @param compute indicates whether the bounding box has to be computed with the min/max args
83  *
84  **/
85  BoundingBox(const tlp::Vec3f &min, const tlp::Vec3f &max, bool checkMinMax = false);
86 
87  /**
88  * @brief restore an invalid state.
89  **/
90  void clear();
91 
92  /**
93  * @brief init the bounding box with the point passed as parameter.
94  * @param coord A point in the 3D space
95  **/
96  inline void init(const tlp::Vec3f &coord) {
97  (*this)[0] = (*this)[1] = coord;
98  }
99 
100  /**
101  * @brief Returns the geometrical center of the bounding box.
102  * An assertion is raised in debug mode if the BoundingBox is not valid.
103  *
104  * @return The center of the bounding box :Vec3f
105  **/
106  inline Vec3f center() const {
107  assert(isValid());
108  return ((*this)[0] + (*this)[1]) / 2.f;
109  }
110 
111  /**
112  * @brief Returns the width of the bounding box
113  * An assertion is raised in debug mode if the BoundingBox is not valid.
114  *
115  **/
116  inline float width() const {
117  assert(isValid());
118  return ((*this)[1][0] - (*this)[0][0]);
119  }
120 
121  /**
122  * @brief Returns the height of the bounding box
123  * An assertion is raised in debug mode if the bounding box is not valid.
124  *
125  **/
126  inline float height() const {
127  assert(isValid());
128  return ((*this)[1][1] - (*this)[0][1]);
129  }
130 
131  /**
132  * @brief Returns the depth of the bounding box
133  * An assertion is raised in debug mode if the bounding box is not valid.
134  *
135  **/
136  inline float depth() const {
137  assert(isValid());
138  return ((*this)[1][2] - (*this)[0][2]);
139  }
140 
141  /**
142  * @brief Expands the bounding box to one containing the point passed as parameter.
143  * If the parameter is inside the bounding box, it remains unchanged.
144  *
145  * @param coord A point in the 3D space we want the bounding box to encompass.
146  * @param noCheck if true current bounding box validity is not checked
147  * @return void
148  **/
149  void expand(const tlp::Vec3f &coord, bool noCheck = false);
150 
151  /**
152  * @brief Expands the bounding box to one containing all the point of the vector passed as
153  *parameter.
154  *
155  * @param coords A vector of point in the 3D space we want the bounding box to encompass.
156  * @return void
157  **/
158  inline void expand(const std::vector<tlp::Vec3f> &coords) {
159  auto it = coords.begin();
160  expand(*it);
161  for (++it; it < coords.end(); ++it)
162  expand(*it, true);
163  }
164 
165  /**
166  * @brief Expands the bounding box to one containing the bounding box passed as parameter.
167  * If the parameter is inside the bounding box, it remains unchanged.
168  *
169  * @param bb A bounding box.
170  * @param noCheck if true current bounding box validity is not checked
171  * @return void
172  **/
173  void expand(const tlp::BoundingBox &bb, bool noCheck = false);
174 
175  /**
176  * @brief Translates the bounding box by the displacement given by the vector passed as parameter.
177  *
178  * @param vec The displacement vector in 3D space to translate this bounding box by.
179  * @return void
180  **/
181  void translate(const tlp::Vec3f &vec);
182 
183  /**
184  * @brief Scales the bounding box, i.e. multiplying its components by a vector passed as
185  *parameter.
186  *
187  * @param factor The factor vector to scale this bounding box by.
188  * @return void
189  **/
190  void scale(const tlp::Vec3f &factor);
191 
192  /**
193  * @brief Checks whether the bounding box's lowest point is less than it's highest point.
194  * "Less Than" means axis-by-axis comparison, i.e. x1 < x2 && y1 < y2 && z1 < z2.
195  *
196  * @return bool Whether this bounding box is valid.
197  **/
198  bool isValid() const;
199 
200  /**
201  * @brief Checks if the given vector is inside the current bounding box. If the bounding box is
202  *invalid the result is always false.
203  * @param coord A point in the 3D space.
204  * @param noCheck if true current bounding box validity is not checked
205  * @return bool Whether coord is in the bounding box.
206  **/
207  bool contains(const tlp::Vec3f &coord, bool noCheck = false) const;
208 
209  /**
210  * @brief Checks if the given bounding box is inside the current bounding box. If one of the
211  *bounding boxes is invalid the result is always false.
212  * @param boundingBox The bounding box to test inclusion
213  * @return bool Whether boundingBox is in the bounding box.
214  **/
215  bool contains(const tlp::BoundingBox &boundingBox) const;
216 
217  /**
218  * @brief Checks if the given bounding box intersects the current one. If one of the bounding box
219  *is invalid return false.
220  * @param boundingBox The bounding box to compare with.
221  * @return bool Whether the bounding boxes intersect.
222  **/
223  bool intersect(const tlp::BoundingBox &boundingBox) const;
224 
225  /**
226  * @brief Checks if the bounding box intersects a given line segment. If the bounding box is
227  *invalid the result is always false.
228  * @param segStart the start point of the line segment on which to check intersection
229  * @param segEnd the end point of the line segment on which to check intersection
230  * @return bool Whether the line segment intersects the bounding box
231  **/
232  bool intersect(const Vec3f &segStart, const Vec3f &segEnd) const;
233 
234  /**
235  * @brief The vector passed as parameter is modified to contain the 8 points of the bounding box.
236  * The points are, in order :
237  * 0: lower leftmost closest point (the bounding box's minimum)
238  * 1: lower rightmost closest point
239  * 2: highest rightmost closest point
240  * 3: highest leftmost closest point
241  * 4: lower rightmost farthest point
242  * 5: lower rightmost farthest point
243  * 6: highest rightmost farthest point
244  * 7: highest leftmost farthest point
245  *
246  * Crude ASCII art again, sorry for your eyes.
247  *
248  * @verbatim
249 
250  6_________ 7
251  /| /|
252  / | / |
253  3/__|_____/2 |
254  | |_____|__|
255  | /4 | /5
256  | / | /
257  |/_______|/
258  0 1
259 
260  @endverbatim
261  *
262  * @param bb A vector in which to put the points of the bounding box.
263  * @return void
264  **/
265  void getCompleteBB(Vec3f bb[8]) const;
266 };
267 } // namespace tlp
268 
269 #endif // Tulip_BOUNDINGBOX_H
void expand(const std::vector< tlp::Vec3f > &coords)
Expands the bounding box to one containing all the point of the vector passed as parameter.
Definition: BoundingBox.h:158
float width() const
Returns the width of the bounding box An assertion is raised in debug mode if the BoundingBox is not ...
Definition: BoundingBox.h:116
This class represents the 3D bounding box of an object. It is mostly used to determine whether or not...
Definition: BoundingBox.h:67
void init(const tlp::Vec3f &coord)
init the bounding box with the point passed as parameter.
Definition: BoundingBox.h:96
Vec3f center() const
Returns the geometrical center of the bounding box. An assertion is raised in debug mode if the Bound...
Definition: BoundingBox.h:106
float depth() const
Returns the depth of the bounding box An assertion is raised in debug mode if the bounding box is not...
Definition: BoundingBox.h:136
float height() const
Returns the height of the bounding box An assertion is raised in debug mode if the bounding box is no...
Definition: BoundingBox.h:126