26 #ifndef WFMATH_ROT_BOX_H
27 #define WFMATH_ROT_BOX_H
29 #include <wfmath/point.h>
30 #include <wfmath/rotmatrix.h>
31 #include <wfmath/intersect_decls.h>
36 std::ostream& operator<<(std::ostream& os,
const RotBox<dim>& r);
38 std::istream& operator>>(std::istream& is, RotBox<dim>& r);
50 RotBox() : m_corner0{}, m_size{}, m_orient{} {}
72 friend std::ostream& operator<< <dim>(std::ostream& os,
const RotBox& r);
73 friend std::istream&
operator>> <dim>(std::istream& is,
RotBox& r);
79 bool operator==(
const RotBox& b)
const {
return isEqualTo(b);}
80 bool operator!=(
const RotBox& b)
const {
return !isEqualTo(b);}
82 bool isValid()
const {
return m_corner0.isValid() && m_size.isValid()
83 && m_orient.isValid();}
87 size_t numCorners()
const {
return 1 << dim;}
88 Point<dim> getCorner(
size_t i)
const;
89 Point<dim> getCenter()
const {
return m_corner0 +
Prod(m_size / 2, m_orient);}
107 {m_corner0 += v;
return *
this;}
108 RotBox& moveCornerTo(
const Point<dim>& p,
size_t corner)
109 {
return shift(p - getCorner(corner));}
110 RotBox& moveCenterTo(
const Point<dim>& p)
111 {
return shift(p - getCenter());}
113 RotBox& rotateCorner(
const RotMatrix<dim>& m,
size_t corner)
114 {rotatePoint(m, getCorner(corner));
return *
this;}
115 RotBox& rotateCenter(
const RotMatrix<dim>& m)
116 {rotatePoint(m, getCenter());
return *
this;}
117 RotBox& rotatePoint(
const RotMatrix<dim>& m,
const Point<dim>& p)
118 {m_orient =
Prod(m_orient, m); m_corner0.
rotate(m, p);
return *
this;}
121 RotBox& rotateCorner(
const Quaternion& q,
size_t corner);
122 RotBox& rotateCenter(
const Quaternion& q);
123 RotBox& rotatePoint(
const Quaternion& q,
const Point<dim>& p);
127 AxisBox<dim> boundingBox()
const;
128 Ball<dim> boundingSphere()
const
129 {
return Ball<dim>(getCenter(), m_size.
mag() / 2);}
130 Ball<dim> boundingSphereSloppy()
const
131 {
return Ball<dim>(getCenter(), m_size.
sqrMag() / 2);}
133 RotBox toParentCoords(
const Point<dim>& origin,
134 const RotMatrix<dim>& rotation = RotMatrix<dim>().identity())
const
135 {
return RotBox(m_corner0.toParentCoords(origin, rotation), m_size,
136 m_orient * rotation);}
137 RotBox toParentCoords(
const AxisBox<dim>& coords)
const
138 {
return RotBox(m_corner0.toParentCoords(coords), m_size, m_orient);}
139 RotBox toParentCoords(
const RotBox<dim>& coords)
const
140 {
return RotBox(m_corner0.toParentCoords(coords), m_size,
141 m_orient * coords.m_orient);}
147 RotBox toLocalCoords(
const Point<dim>& origin,
148 const RotMatrix<dim>& rotation = RotMatrix<dim>().identity())
const
149 {
return RotBox(m_corner0.toLocalCoords(origin, rotation), m_size,
150 rotation * m_orient);}
151 RotBox toLocalCoords(
const AxisBox<dim>& coords)
const
152 {
return RotBox(m_corner0.toLocalCoords(coords), m_size, m_orient);}
153 RotBox toLocalCoords(
const RotBox<dim>& coords)
const
154 {
return RotBox(m_corner0.toLocalCoords(coords), m_size,
155 coords.m_orient * m_orient);}
158 RotBox toParentCoords(
const Point<dim>& origin,
const Quaternion& rotation)
const;
159 RotBox toLocalCoords(
const Point<dim>& origin,
const Quaternion& rotation)
const;
161 friend bool Intersect<dim>(
const RotBox& r,
const Point<dim>& p,
bool proper);
162 friend bool Contains<dim>(
const Point<dim>& p,
const RotBox& r,
bool proper);
164 friend bool Intersect<dim>(
const RotBox& r,
const AxisBox<dim>& b,
bool proper);
165 friend bool Contains<dim>(
const RotBox& r,
const AxisBox<dim>& b,
bool proper);
166 friend bool Contains<dim>(
const AxisBox<dim>& b,
const RotBox& r,
bool proper);
168 friend bool Intersect<dim>(
const RotBox& r,
const Ball<dim>& b,
bool proper);
169 friend bool Contains<dim>(
const RotBox& r,
const Ball<dim>& b,
bool proper);
170 friend bool Contains<dim>(
const Ball<dim>& b,
const RotBox& r,
bool proper);
172 friend bool Intersect<dim>(
const RotBox& r,
const Segment<dim>& s,
bool proper);
173 friend bool Contains<dim>(
const RotBox& r,
const Segment<dim>& s,
bool proper);
174 friend bool Contains<dim>(
const Segment<dim>& s,
const RotBox& r,
bool proper);
176 friend bool Intersect<dim>(
const RotBox& r1,
const RotBox& r2,
bool proper);
177 friend bool Contains<dim>(
const RotBox& outer,
const RotBox& inner,
bool proper);
179 friend bool Intersect<dim>(
const Polygon<dim>& p,
const RotBox& r,
bool proper);
180 friend bool Contains<dim>(
const Polygon<dim>& p,
const RotBox& r,
bool proper);
181 friend bool Contains<dim>(
const RotBox& r,
const Polygon<dim>& p,
bool proper);
185 Point<dim> m_corner0;
187 RotMatrix<dim> m_orient;
191 inline bool RotBox<dim>::isEqualTo(
const RotBox<dim>& b,
CoordType epsilon)
const
193 return Equal(m_corner0, b.m_corner0, epsilon)
194 && Equal(m_size, b.m_size, epsilon)
195 && Equal(m_orient, b.m_orient, epsilon);
Point & rotate(const RotMatrix< dim > &m, const Point &p)
Rotate about point p.
A dim dimensional box, lying at an arbitrary angle.
const RotMatrix< dim > & orientation() const
returns the orientation of the box
RotBox()
construct an uninitialized box
Vector< dim > & size()
returns the size of the box
void fromAtlas(const AtlasInType &a)
Set the box's value to that given by an Atlas object.
RotBox(const Point< dim > &p, const Vector< dim > &size, const RotMatrix< dim > &orientation)
construct a box from the given parameters
RotMatrix< dim > & orientation()
returns the orientation of the box
const Vector< dim > & size() const
returns the size of the box
Point< dim > & corner0()
returns the base corner of the box
RotBox(const RotBox &b)=default
construct a copy of the box
AtlasOutType toAtlas() const
Create an Atlas object from the box.
const Point< dim > & corner0() const
returns the base corner of the box
A dim dimensional rotation matrix. Technically, a member of the group O(dim).
CoordType mag() const
The magnitude of a vector.
CoordType sqrMag() const
The squared magnitude of a vector.
Generic library namespace.
double CoordType
Basic floating point type.
RotMatrix< dim > Prod(const RotMatrix< dim > &m1, const RotMatrix< dim > &m2)
returns m1 * m2