29 #ifndef WFMATH_AXIS_BOX_H
30 #define WFMATH_AXIS_BOX_H
32 #include <wfmath/intersect_decls.h>
33 #include <wfmath/point.h>
38 bool Intersection(
const AxisBox<dim>& a1,
const AxisBox<dim>& a2, AxisBox<dim>& out);
40 AxisBox<dim> Union(
const AxisBox<dim>& a1,
const AxisBox<dim>& a2);
43 std::ostream& operator<<(std::ostream& os,
const AxisBox<dim>& m);
45 std::istream& operator>>(std::istream& is, AxisBox<dim>& m);
48 template<
int dim,
template<
class,
class>
class container>
49 AxisBox<dim>
BoundingBox(
const container<AxisBox<dim>, std::allocator<AxisBox<dim> > >& c);
52 template<
int dim,
template<
class,
class>
class container>
53 AxisBox<dim>
BoundingBox(
const container<Point<dim>, std::allocator<Point<dim> > >& c);
75 friend std::ostream& operator<< <dim>(std::ostream& os,
const AxisBox& a);
76 friend std::istream&
operator>> <dim>(std::istream& is,
AxisBox& a);
86 bool operator==(
const AxisBox& a)
const {
return isEqualTo(a);}
87 bool operator!=(
const AxisBox& a)
const {
return !isEqualTo(a);}
89 bool isValid()
const {
return m_low.isValid() && m_high.isValid();}
93 size_t numCorners()
const {
return 1 << dim;}
94 Point<dim> getCorner(
size_t i)
const;
95 Point<dim> getCenter()
const {
return Midpoint(m_low, m_high);}
116 bool ordered =
false);
121 {m_low += v; m_high += v;
return *
this;}
122 AxisBox& moveCornerTo(
const Point<dim>& p,
size_t corner)
123 {
return shift(p - getCorner(corner));}
124 AxisBox& moveCenterTo(
const Point<dim>& p)
125 {
return shift(p - getCenter());}
131 AxisBox boundingBox()
const {
return *
this;}
132 Ball<dim> boundingSphere()
const;
133 Ball<dim> boundingSphereSloppy()
const;
135 AxisBox toParentCoords(
const Point<dim>& origin)
const
136 {
return AxisBox(m_low.toParentCoords(origin), m_high.toParentCoords(origin),
true);}
137 AxisBox toParentCoords(
const AxisBox<dim>& coords)
const
138 {
return AxisBox(m_low.toParentCoords(coords), m_high.toParentCoords(coords),
true);}
144 AxisBox toLocalCoords(
const Point<dim>& origin)
const
145 {
return AxisBox(m_low.toLocalCoords(origin), m_high.toLocalCoords(origin),
true);}
146 AxisBox toLocalCoords(
const AxisBox<dim>& coords)
const
147 {
return AxisBox(m_low.toLocalCoords(coords), m_high.toLocalCoords(coords),
true);}
154 friend bool Intersect<dim>(
const AxisBox& b,
const Point<dim>& p,
bool proper);
155 friend bool Contains<dim>(
const Point<dim>& p,
const AxisBox& b,
bool proper);
157 friend bool Intersect<dim>(
const AxisBox& b1,
const AxisBox& b2,
bool proper);
158 friend bool Contains<dim>(
const AxisBox& outer,
const AxisBox& inner,
bool proper);
160 friend bool Intersect<dim>(
const Ball<dim>& b,
const AxisBox& a,
bool proper);
161 friend bool Contains<dim>(
const Ball<dim>& b,
const AxisBox& a,
bool proper);
162 friend bool Contains<dim>(
const AxisBox& a,
const Ball<dim>& b,
bool proper);
164 friend bool Intersect<dim>(
const Segment<dim>& s,
const AxisBox& b,
bool proper);
165 friend bool Contains<dim>(
const Segment<dim>& s,
const AxisBox& b,
bool proper);
167 friend bool Intersect<dim>(
const RotBox<dim>& r,
const AxisBox& b,
bool proper);
168 friend bool Contains<dim>(
const RotBox<dim>& r,
const AxisBox& b,
bool proper);
169 friend bool Contains<dim>(
const AxisBox& b,
const RotBox<dim>& r,
bool proper);
171 friend bool Intersect<dim>(
const Polygon<dim>& p,
const AxisBox& b,
bool proper);
172 friend bool Contains<dim>(
const Polygon<dim>& p,
const AxisBox& b,
bool proper);
173 friend bool Contains<dim>(
const AxisBox& b,
const Polygon<dim>& p,
bool proper);
177 Point<dim> m_low, m_high;
181 inline bool AxisBox<dim>::isEqualTo(
const AxisBox<dim>& b,
CoordType epsilon)
const
183 return Equal(m_low, b.m_low, epsilon)
184 && Equal(m_high, b.m_high, epsilon);
A dim dimensional axis-aligned box.
AxisBox(const Point< dim > &p1, const Point< dim > &p2, bool ordered=false)
Construct a box with opposite corners p1 and p2.
void fromAtlas(const AtlasInType &a)
Set the box's value to that given by an Atlas object.
const Point< dim > & lowCorner() const
Get a reference to corner 0.
AxisBox()=default
Construct an uninitialized box.
AxisBox(const AxisBox &a)=default
Construct a copy of a box.
CoordType lowerBound(const int axis) const
Get the lower bound of the box on the i'th axis.
CoordType upperBound(const int axis) const
Get the upper bound of the box on the i'th axis.
const Point< dim > & highCorner() const
Get a reference to corner (2^dim)-1.
AtlasOutType toAtlas() const
Create an Atlas object from the box.
AxisBox & setCorners(const Point< dim > &p1, const Point< dim > &p2, bool ordered=false)
Set the box to have opposite corners p1 and p2.
Generic library namespace.
double CoordType
Basic floating point type.
AxisBox< dim > BoundingBox(const container< AxisBox< dim >, std::allocator< AxisBox< dim > > > &c)
Get the axis-aligned bounding box for a set of boxes.
Point< dim > Midpoint(const Point< dim > &p1, const Point< dim > &p2, CoordType dist=0.5)