26 #ifndef WFMATH_POINT_H
27 #define WFMATH_POINT_H
29 #include <wfmath/const.h>
39 Point<dim>& operator+=(Point<dim>& p,
const Vector<dim>& v);
41 Point<dim>& operator-=(Point<dim>& p,
const Vector<dim>& v);
44 Vector<dim> operator-(
const Point<dim>& c1,
const Point<dim>& c2);
46 Point<dim> operator+(
const Point<dim>& c,
const Vector<dim>& v);
48 Point<dim> operator+(
const Vector<dim>& v,
const Point<dim>& c);
50 Point<dim> operator-(
const Point<dim>& c,
const Vector<dim>& v);
53 CoordType SquaredDistance(
const Point<dim>& p1,
const Point<dim>& p2);
55 CoordType Distance(
const Point<dim>& p1,
const Point<dim>& p2)
56 {
return std::sqrt(SquaredDistance(p1, p2));}
58 CoordType SloppyDistance(
const Point<dim>& p1,
const Point<dim>& p2)
59 {
return (p1 - p2).sloppyMag();}
62 template<
int dim,
template<
class,
class>
class container>
63 Point<dim>
Barycenter(
const container<Point<dim>, std::allocator<Point<dim> > >& c);
71 template<
int dim,
template<
class,
class>
class container,
72 template<
class,
class>
class container2>
73 Point<dim>
Barycenter(
const container<Point<dim>, std::allocator<Point<dim> > >& c,
74 const container2<
CoordType, std::allocator<CoordType> >& weights);
78 Point<dim>
Midpoint(
const Point<dim>& p1,
const Point<dim>& p2,
82 std::ostream& operator<<(std::ostream& os, const Point<dim>& m);
84 std::istream& operator>>(std::istream& is, Point<dim>& m);
86 template<
typename Shape>
102 Point (
const Point& p);
104 explicit Point (
const AtlasInType& a);
113 friend std::ostream& operator<< <dim>(std::ostream& os,
const Point& p);
114 friend std::istream&
operator>> <dim>(std::istream& is, Point& p);
121 Point& operator= (
const Point& rhs);
123 bool isEqualTo(
const Point &p,
CoordType epsilon = numeric_constants<CoordType>::epsilon())
const;
124 bool operator== (
const Point& rhs)
const {
return isEqualTo(rhs);}
125 bool operator!= (
const Point& rhs)
const {
return !isEqualTo(rhs);}
127 bool isValid()
const {
return m_valid;}
129 void setValid(
bool valid =
true) {m_valid = valid;}
137 friend Vector<dim> operator-<dim>(
const Point& c1,
const Point& c2);
138 friend Point
operator+<dim>(
const Point& c,
const Vector<dim>& v);
139 friend Point
operator-<dim>(
const Point& c,
const Vector<dim>& v);
140 friend Point
operator+<dim>(
const Vector<dim>& v,
const Point& c);
142 friend Point&
operator+=<dim>(Point& p,
const Vector<dim>& rhs);
143 friend Point&
operator-=<dim>(Point& p,
const Vector<dim>& rhs);
147 {
return (*
this = p +
Prod(*
this - p, m));}
151 size_t numCorners()
const {
return 1;}
152 Point<dim> getCorner(
size_t)
const {
return *
this;}
153 Point<dim> getCenter()
const {
return *
this;}
155 Point shift(
const Vector<dim>& v) {
return *
this += v;}
156 Point moveCornerTo(
const Point& p,
size_t)
157 {
return operator=(p);}
158 Point moveCenterTo(
const Point& p) {
return operator=(p);}
160 Point& rotateCorner(
const RotMatrix<dim>&,
size_t)
162 Point& rotateCenter(
const RotMatrix<dim>&) {
return *
this;}
163 Point& rotatePoint(
const RotMatrix<dim>& m,
const Point& p) {
return rotate(m, p);}
166 Point&
rotate(
const Quaternion& q,
const Point& p);
167 Point& rotateCorner(
const Quaternion&,
size_t)
169 Point& rotateCenter(
const Quaternion&) {
return *
this;}
170 Point& rotatePoint(
const Quaternion& q,
const Point& p);
174 AxisBox<dim> boundingBox()
const;
175 Ball<dim> boundingSphere()
const;
176 Ball<dim> boundingSphereSloppy()
const;
178 Point toParentCoords(
const Point& origin,
179 const RotMatrix<dim>& rotation = RotMatrix<dim>().identity())
const
180 {
return origin + (*
this -
Point().setToOrigin()) * rotation;}
181 Point toParentCoords(
const AxisBox<dim>& coords)
const;
182 Point toParentCoords(
const RotBox<dim>& coords)
const;
188 Point toLocalCoords(
const Point& origin,
189 const RotMatrix<dim>& rotation = RotMatrix<dim>().identity())
const
190 {
return Point().setToOrigin() + rotation * (*
this - origin);}
191 Point toLocalCoords(
const AxisBox<dim>& coords)
const;
192 Point toLocalCoords(
const RotBox<dim>& coords)
const;
195 Point toParentCoords(
const Point& origin,
const Quaternion& rotation)
const;
196 Point toLocalCoords(
const Point& origin,
const Quaternion& rotation)
const;
206 friend CoordType SquaredDistance<dim>(
const Point& p1,
const Point& p2);
258 const CoordType* elements()
const {
return m_elem;}
278 inline Point<dim> operator+(
const Point<dim>& c,
const Vector<dim>& v)
288 inline Point<dim> operator+(
const Vector<dim>& v,
const Point<dim>& c)
298 inline Point<dim> operator-(
const Point<dim>& c,
const Vector<dim>& v)
315 inline Point<3>::Point(CoordType x, CoordType y, CoordType z) : m_valid(true)
324 #endif // WFMATH_POINT_H