diff options
author | Lane Kolbly <lane@rscheme.org> | 2017-08-13 13:36:22 +0200 |
---|---|---|
committer | Tiger Wang <ziwei.tiger@outlook.com> | 2017-08-13 13:36:22 +0200 |
commit | 62bc951474b190f4d22012708d59cf010310b9e7 (patch) | |
tree | f3ff76acd74e3cbb6f19c5d78ebe5050823c1a4f /src/Cuboid.h | |
parent | Rename docs folder to dev-docs (#3898) (diff) | |
download | cuberite-62bc951474b190f4d22012708d59cf010310b9e7.tar cuberite-62bc951474b190f4d22012708d59cf010310b9e7.tar.gz cuberite-62bc951474b190f4d22012708d59cf010310b9e7.tar.bz2 cuberite-62bc951474b190f4d22012708d59cf010310b9e7.tar.lz cuberite-62bc951474b190f4d22012708d59cf010310b9e7.tar.xz cuberite-62bc951474b190f4d22012708d59cf010310b9e7.tar.zst cuberite-62bc951474b190f4d22012708d59cf010310b9e7.zip |
Diffstat (limited to 'src/Cuboid.h')
-rw-r--r-- | src/Cuboid.h | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/Cuboid.h b/src/Cuboid.h index 3ade5bc20..ae4fed538 100644 --- a/src/Cuboid.h +++ b/src/Cuboid.h @@ -40,7 +40,18 @@ public: /** Returns true if the cuboids have at least one voxel in common. Both coords are considered inclusive. Assumes both cuboids are sorted. */ - bool DoesIntersect(const cCuboid & a_Other) const; + inline bool DoesIntersect(const cCuboid & a_Other) const + { + ASSERT(IsSorted()); + ASSERT(a_Other.IsSorted()); + + // In order for cuboids to intersect, each of their coord intervals need to intersect + return ( + DoIntervalsIntersect(p1.x, p2.x, a_Other.p1.x, a_Other.p2.x) && + DoIntervalsIntersect(p1.y, p2.y, a_Other.p1.y, a_Other.p2.y) && + DoIntervalsIntersect(p1.z, p2.z, a_Other.p1.z, a_Other.p2.z) + ); + } bool IsInside(const Vector3i & v) const { @@ -95,6 +106,17 @@ public: /** If needed, expands the cuboid so that it contains the specified point. Assumes sorted. Doesn't contract. */ void Engulf(const Vector3i & a_Point); + +private: + + /** Returns true if the two specified intervals have a non-empty union */ + inline static bool DoIntervalsIntersect(int a_Min1, int a_Max1, int a_Min2, int a_Max2) + { + ASSERT(a_Min1 <= a_Max1); + ASSERT(a_Min2 <= a_Max2); + return ((a_Min1 <= a_Max2) && (a_Max1 >= a_Min2)); + } + } ; // tolua_end |