Arty
bbox.h
1 #ifndef BBOX_H
2 #define BBOX_H
3 
4 #include <cfloat>
5 #include <algorithm>
6 #include "float3.h"
7 
9 struct BBox {
10  float3 min, max;
11 
12  BBox() {}
13  BBox(const float3& f) : min(f), max(f) {}
14  BBox(const float3& min, const float3& max) : min(min), max(max) {}
15 
16  static BBox empty() { return BBox(float3(FLT_MAX), float3(-FLT_MAX)); }
17  static BBox full() { return BBox(float3(-FLT_MAX), float3(FLT_MAX)); }
18 };
19 
20 inline BBox extend(const BBox& bb, const float3& f) {
21  return BBox(min(bb.min, f), max(bb.max, f));
22 }
23 
24 inline BBox extend(const BBox& bb1, const BBox& bb2) {
25  return BBox(min(bb1.min, bb2.min), max(bb1.max, bb2.max));
26 }
27 
28 inline BBox overlap(const BBox& bb1, const BBox& bb2) {
29  return BBox(max(bb1.min, bb2.min), min(bb1.max, bb2.max));
30 }
31 
32 inline float half_area(const float3& min, const float3& max) {
33  const float3 len = max - min;
34  const float kx = std::max(len.x, 0.0f);
35  const float ky = std::max(len.y, 0.0f);
36  const float kz = std::max(len.z, 0.0f);
37  return kx * (ky + kz) + ky * kz;
38 }
39 
40 inline float half_area(const BBox& bb) {
41  return half_area(bb.min, bb.max);
42 }
43 
44 inline bool is_empty(const BBox& bb) {
45  return bb.min.x > bb.max.x ||
46  bb.min.y > bb.max.y ||
47  bb.min.z > bb.max.z;
48 }
49 
50 inline bool is_inside(const BBox& bb, const float3& f) {
51  return f.x >= bb.min.x && f.y >= bb.min.y && f.z >= bb.min.z &&
52  f.x <= bb.max.x && f.y <= bb.max.y && f.z <= bb.max.z;
53 }
54 
55 inline bool is_overlapping(const BBox& bb1, const BBox& bb2) {
56  return bb1.min.x <= bb2.max.x && bb1.max.x >= bb2.min.x &&
57  bb1.min.y <= bb2.max.y && bb1.max.y >= bb2.min.y &&
58  bb1.min.z <= bb2.max.z && bb1.max.z >= bb2.min.z;
59 }
60 
61 inline bool is_included(const BBox& bb1, const BBox& bb2) {
62  return bb1.min.x >= bb2.min.x && bb1.max.x <= bb2.max.x &&
63  bb1.min.y >= bb2.min.y && bb1.max.y <= bb2.max.y &&
64  bb1.min.z >= bb2.min.z && bb1.max.z <= bb2.max.z;
65 }
66 
67 inline bool is_strictly_included(const BBox& bb1, const BBox& bb2) {
68  return is_included(bb1, bb2) &&
69  (bb1.min.x > bb2.min.x || bb1.max.x < bb2.max.x ||
70  bb1.min.y > bb2.min.y || bb1.max.y < bb2.max.y ||
71  bb1.min.z > bb2.min.z || bb1.max.z < bb2.max.z);
72 }
73 
74 #pragma omp declare reduction \
75  (bbox_extend:BBox:omp_out = extend(omp_out, omp_in)) \
76  initializer(omp_priv = BBox::empty())
77 
78 #endif // BBOX_H
Bounding box represented by its two extreme points.
Definition: bbox.h:9
Definition: float3.h:10