21 return BBox(min(bb.min, f), max(bb.max, f));
25 return BBox(min(bb1.min, bb2.min), max(bb1.max, bb2.max));
29 return BBox(max(bb1.min, bb2.min), min(bb1.max, bb2.max));
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;
40 inline float half_area(
const BBox& bb) {
41 return half_area(bb.min, bb.max);
44 inline bool is_empty(
const BBox& bb) {
45 return bb.min.x > bb.max.x ||
46 bb.min.y > bb.max.y ||
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;
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;
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;
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);
74 #pragma omp declare reduction \ 75 (bbox_extend:BBox:omp_out = extend(omp_out, omp_in)) \ 76 initializer(omp_priv = BBox::empty()) Bounding box represented by its two extreme points.
Definition: bbox.h:9