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);
64 bool operator==(
const Segment& b)
const {
return isEqualTo(b);}
65 bool operator!=(
const Segment& b)
const {
return !isEqualTo(b);}
67 bool isValid()
const {
return m_p1.isValid() && m_p2.isValid();}
71 size_t numCorners()
const {
return 2;}
72 Point<dim> getCorner(
size_t i)
const {
return i ? m_p2 : m_p1;}
73 Point<dim> getCenter()
const {
return Midpoint(m_p1, m_p2);}
83 {m_p1 += v; m_p2 += v;
return *
this;}
84 Segment& moveCornerTo(
const Point<dim>& p,
size_t corner);
85 Segment& moveCenterTo(
const Point<dim>& p)
86 {
return shift(p - getCenter());}
88 Segment& rotateCorner(
const RotMatrix<dim>& m,
size_t corner);
89 Segment& rotateCenter(
const RotMatrix<dim>& m)
90 {rotatePoint(m, getCenter());
return *
this;}
91 Segment<dim>& rotatePoint(
const RotMatrix<dim>& m,
const Point<dim>& p)
95 Segment& rotateCorner(
const Quaternion& q,
size_t corner);
96 Segment& rotateCenter(
const Quaternion& q);
97 Segment& rotatePoint(
const Quaternion& q,
const Point<dim>& p);
101 AxisBox<dim> boundingBox()
const {
return AxisBox<dim>(m_p1, m_p2);}
102 Ball<dim> boundingSphere()
const
103 {
return Ball<dim>(getCenter(), Distance(m_p1, m_p2) / 2);}
104 Ball<dim> boundingSphereSloppy()
const
105 {
return Ball<dim>(getCenter(), SloppyDistance(m_p1, m_p2) / 2);}
107 Segment toParentCoords(
const Point<dim>& origin,
108 const RotMatrix<dim>& rotation = RotMatrix<dim>().identity())
const
109 {
return Segment(m_p1.toParentCoords(origin, rotation),
110 m_p2.toParentCoords(origin, rotation));}
111 Segment toParentCoords(
const AxisBox<dim>& coords)
const
112 {
return Segment(m_p1.toParentCoords(coords), m_p2.toParentCoords(coords));}
113 Segment toParentCoords(
const RotBox<dim>& coords)
const
114 {
return Segment(m_p1.toParentCoords(coords), m_p2.toParentCoords(coords));}
120 Segment toLocalCoords(
const Point<dim>& origin,
121 const RotMatrix<dim>& rotation = RotMatrix<dim>().identity())
const
122 {
return Segment(m_p1.toLocalCoords(origin, rotation),
123 m_p2.toLocalCoords(origin, rotation));}
124 Segment toLocalCoords(
const AxisBox<dim>& coords)
const
125 {
return Segment(m_p1.toLocalCoords(coords), m_p2.toLocalCoords(coords));}
126 Segment toLocalCoords(
const RotBox<dim>& coords)
const
127 {
return Segment(m_p1.toLocalCoords(coords), m_p2.toLocalCoords(coords));}
130 Segment toParentCoords(
const Point<dim>& origin,
131 const Quaternion& rotation)
const;
132 Segment toLocalCoords(
const Point<dim>& origin,
133 const Quaternion& rotation)
const;
135 friend bool Intersect<dim>(
const Segment& s,
const Point<dim>& p,
bool proper);
136 friend bool Contains<dim>(
const Point<dim>& p,
const Segment& s,
bool proper);
138 friend bool Intersect<dim>(
const Segment& s,
const AxisBox<dim>& b,
bool proper);
139 friend bool Contains<dim>(
const AxisBox<dim>& b,
const Segment& s,
bool proper);
141 friend bool Intersect<dim>(
const Segment& s,
const Ball<dim>& b,
bool proper);
142 friend bool Contains<dim>(
const Ball<dim>& b,
const Segment& s,
bool proper);
144 friend bool Intersect<dim>(
const Segment& s1,
const Segment& s2,
bool proper);
145 friend bool Contains<dim>(
const Segment& s1,
const Segment& s2,
bool proper);
147 friend bool Intersect<dim>(
const RotBox<dim>& r,
const Segment& s,
bool proper);
148 friend bool Contains<dim>(
const RotBox<dim>& r,
const Segment& s,
bool proper);
149 friend bool Contains<dim>(
const Segment& s,
const RotBox<dim>& r,
bool proper);
151 friend bool Intersect<dim>(
const Polygon<dim>& r,
const Segment& s,
bool proper);
152 friend bool Contains<dim>(
const Polygon<dim>& p,
const Segment& s,
bool proper);
153 friend bool Contains<dim>(
const Segment& s,
const Polygon<dim>& p,
bool proper);
157 Point<dim> m_p1, m_p2;
161 inline bool Segment<dim>::isEqualTo(
const Segment<dim>& s,
164 return Equal(m_p1, s.m_p1, epsilon)
165 && Equal(m_p2, s.m_p2, epsilon);
Point & rotate(const RotMatrix< dim > &m, const Point &p)
Rotate about point p.
A line segment embedded in dim dimensions.
Point< dim > & endpoint(const int i)
get one end of the segment
Segment()
construct an uninitialized segment
Segment(const Point< dim > &p1, const Point< dim > &p2)
construct a segment with endpoints p1 and p2
const Point< dim > & endpoint(const int i) const
get one end of the segment
Segment(const Segment &s)=default
construct a copy of a segment
Generic library namespace.
double CoordType
Basic floating point type.
Point< dim > Midpoint(const Point< dim > &p1, const Point< dim > &p2, CoordType dist=0.5)