celestia/src/celmath/aabox.h

114 lines
2.7 KiB
C++

// aabox.h
//
// Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
//
// Axis-aligned bounding box class
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
#ifndef _AABOX_H_
#define _AABOX_H_
#include <celmath/vecmath.h>
class AxisAlignedBox
{
public:
inline AxisAlignedBox();
AxisAlignedBox(Point3f _min, Point3f _max) :
minimum(_min), maximum(_max) {};
AxisAlignedBox(Point3f center) :
minimum(center), maximum(center) {};
inline Point3f getMinimum() const;
inline Point3f getMaximum() const;
inline Point3f getCenter() const;
inline Vec3f getExtents() const;
inline bool empty() const;
inline bool contains(const Point3f&) const;
inline void include(const Point3f&);
inline void include(const AxisAlignedBox&);
private:
Point3f minimum;
Point3f maximum;
};
AxisAlignedBox::AxisAlignedBox() :
minimum(1.0e20f, 1.0e20f, 1.0e20f),
maximum(-1.0e20f, -1.0e20f, -1.0e20f)
{
}
Point3f AxisAlignedBox::getMinimum() const
{
return minimum;
}
Point3f AxisAlignedBox::getMaximum() const
{
return maximum;
}
Point3f AxisAlignedBox::getCenter() const
{
return Point3f((minimum.x + maximum.x) * 0.5f,
(minimum.y + maximum.y) * 0.5f,
(minimum.z + maximum.z) * 0.5f);
}
Vec3f AxisAlignedBox::getExtents() const
{
return maximum - minimum;
}
bool AxisAlignedBox::empty() const
{
return maximum.x < minimum.x || maximum.y < minimum.y || maximum.z < minimum.z;
}
bool AxisAlignedBox::contains(const Point3f& p) const
{
return (p.x >= minimum.x && p.x <= maximum.x &&
p.y >= minimum.y && p.y <= maximum.y &&
p.z >= minimum.z && p.z <= maximum.z);
}
void AxisAlignedBox::include(const Point3f& p)
{
if (p.x < minimum.x) minimum.x = p.x;
if (p.x > maximum.x) maximum.x = p.x;
if (p.y < minimum.y) minimum.y = p.y;
if (p.y > maximum.y) maximum.y = p.y;
if (p.z < minimum.z) minimum.z = p.z;
if (p.z > maximum.z) maximum.z = p.z;
}
void AxisAlignedBox::include(const AxisAlignedBox& b)
{
if (b.minimum.x < minimum.x) minimum.x = b.minimum.x;
if (b.maximum.x > maximum.x) maximum.x = b.maximum.x;
if (b.minimum.y < minimum.y) minimum.y = b.minimum.y;
if (b.maximum.y > maximum.y) maximum.y = b.maximum.y;
if (b.minimum.z < minimum.z) minimum.z = b.minimum.z;
if (b.maximum.z > maximum.z) maximum.z = b.maximum.z;
}
#if 0
AxisAlignedBox union(const AxisAlignedBox& a, const AxisAlignedBox& b)
{
AxisAlignedBox box(a);
box.union(b);
return box;
}
#endif
#endif // _AABOX_H_