26 #ifndef WFMATH_SEGMENT_H
27 #define WFMATH_SEGMENT_H
29 #include <wfmath/point.h>
30 #include <wfmath/intersect_decls.h>
35 std::ostream& operator<<(std::ostream& os, const Segment<dim>& s);
37 std::istream& operator>>(std::istream& is, Segment<dim>& s);
57 friend std::ostream& operator<< <dim>(std::ostream& os,
const Segment& s);
58 friend std::istream&
operator>> <dim>(std::istream& is,
Segment& s);
61 {m_p1 = s.m_p1; m_p2 = s.m_p2;
return *
this;}
63 bool isEqualTo(
const Segment& s,
CoordType epsilon = numeric_constants<CoordType>::epsilon())
const;
65 bool operator==(
const Segment& b)
const {
return isEqualTo(b);}
66 bool operator!=(
const Segment& b)
const {
return !isEqualTo(b);}
68 bool isValid()
const {
return m_p1.isValid() && m_p2.isValid();}
72 size_t numCorners()
const {
return 2;}
73 Point<dim> getCorner(
size_t i)
const {
return i ? m_p2 : m_p1;}
74 Point<dim> getCenter()
const {
return Midpoint(m_p1, m_p2);}
84 {m_p1 += v; m_p2 += v;
return *
this;}
85 Segment& moveCornerTo(
const Point<dim>& p,
size_t corner);
86 Segment& moveCenterTo(
const Point<dim>& p)
87 {
return shift(p - getCenter());}
89 Segment& rotateCorner(
const RotMatrix<dim>& m,
size_t corner);
90 Segment& rotateCenter(
const RotMatrix<dim>& m)
91 {rotatePoint(m, getCenter());
return *
this;}
92 Segment<dim>& rotatePoint(
const RotMatrix<dim>& m,
const Point<dim>& p)
93 {m_p1.rotate(m, p); m_p2.rotate(m, p);
return *
this;}
96 Segment& rotateCorner(
const Quaternion& q,
size_t corner);
97 Segment& rotateCenter(
const Quaternion& q);
98 Segment& rotatePoint(
const Quaternion& q,
const Point<dim>& p);
102 AxisBox<dim> boundingBox()
const {
return AxisBox<dim>(m_p1, m_p2);}
103 Ball<dim> boundingSphere()
const
104 {
return Ball<dim>(getCenter(), Distance(m_p1, m_p2) / 2);}
105 Ball<dim> boundingSphereSloppy()
const
106 {
return Ball<dim>(getCenter(), SloppyDistance(m_p1, m_p2) / 2);}
108 Segment toParentCoords(
const Point<dim>& origin,
109 const RotMatrix<dim>& rotation = RotMatrix<dim>().identity())
const
110 {
return Segment(m_p1.toParentCoords(origin, rotation),
111 m_p2.toParentCoords(origin, rotation));}
112 Segment toParentCoords(
const AxisBox<dim>& coords)
const
113 {
return Segment(m_p1.toParentCoords(coords), m_p2.toParentCoords(coords));}
114 Segment toParentCoords(
const RotBox<dim>& coords)
const
115 {
return Segment(m_p1.toParentCoords(coords), m_p2.toParentCoords(coords));}
121 Segment toLocalCoords(
const Point<dim>& origin,
122 const RotMatrix<dim>& rotation = RotMatrix<dim>().identity())
const
123 {
return Segment(m_p1.toLocalCoords(origin, rotation),
124 m_p2.toLocalCoords(origin, rotation));}
125 Segment toLocalCoords(
const AxisBox<dim>& coords)
const
126 {
return Segment(m_p1.toLocalCoords(coords), m_p2.toLocalCoords(coords));}
127 Segment toLocalCoords(
const RotBox<dim>& coords)
const
128 {
return Segment(m_p1.toLocalCoords(coords), m_p2.toLocalCoords(coords));}
131 Segment toParentCoords(
const Point<dim>& origin,
132 const Quaternion& rotation)
const;
133 Segment toLocalCoords(
const Point<dim>& origin,
134 const Quaternion& rotation)
const;
136 friend bool Intersect<dim>(
const Segment& s,
const Point<dim>& p,
bool proper);
137 friend bool Contains<dim>(
const Point<dim>& p,
const Segment& s,
bool proper);
139 friend bool Intersect<dim>(
const Segment& s,
const AxisBox<dim>& b,
bool proper);
140 friend bool Contains<dim>(
const AxisBox<dim>& b,
const Segment& s,
bool proper);
142 friend bool Intersect<dim>(
const Segment& s,
const Ball<dim>& b,
bool proper);
143 friend bool Contains<dim>(
const Ball<dim>& b,
const Segment& s,
bool proper);
145 friend bool Intersect<dim>(
const Segment& s1,
const Segment& s2,
bool proper);
146 friend bool Contains<dim>(
const Segment& s1,
const Segment& s2,
bool proper);
148 friend bool Intersect<dim>(
const RotBox<dim>& r,
const Segment& s,
bool proper);
149 friend bool Contains<dim>(
const RotBox<dim>& r,
const Segment& s,
bool proper);
150 friend bool Contains<dim>(
const Segment& s,
const RotBox<dim>& r,
bool proper);
152 friend bool Intersect<dim>(
const Polygon<dim>& r,
const Segment& s,
bool proper);
153 friend bool Contains<dim>(
const Polygon<dim>& p,
const Segment& s,
bool proper);
154 friend bool Contains<dim>(
const Segment& s,
const Polygon<dim>& p,
bool proper);
158 Point<dim> m_p1, m_p2;
162 inline bool Segment<dim>::isEqualTo(
const Segment<dim>& s,
165 return Equal(m_p1, s.m_p1, epsilon)
166 &&
Equal(m_p2, s.m_p2, epsilon);
171 #endif // WFMATH_SEGMENT_H