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;}
84 {m_p1 += v; m_p2 += v;
return *
this;}
87 {
return shift(p - getCenter());}
91 {rotatePoint(m, getCenter());
return *
this;}
93 {m_p1.rotate(m, p); m_p2.rotate(m, p);
return *
this;}
104 {
return Ball<dim>(getCenter(), Distance(m_p1, m_p2) / 2);}
106 {
return Ball<dim>(getCenter(), SloppyDistance(m_p1, m_p2) / 2);}
110 {
return Segment(m_p1.toParentCoords(origin, rotation),
111 m_p2.toParentCoords(origin, rotation));}
113 {
return Segment(m_p1.toParentCoords(coords), m_p2.toParentCoords(coords));}
115 {
return Segment(m_p1.toParentCoords(coords), m_p2.toParentCoords(coords));}
123 {
return Segment(m_p1.toLocalCoords(origin, rotation),
124 m_p2.toLocalCoords(origin, rotation));}
126 {
return Segment(m_p1.toLocalCoords(coords), m_p2.toLocalCoords(coords));}
128 {
return Segment(m_p1.toLocalCoords(coords), m_p2.toLocalCoords(coords));}
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);
165 return Equal(m_p1, s.m_p1, epsilon)
166 &&
Equal(m_p2, s.m_p2, epsilon);
171 #endif // WFMATH_SEGMENT_H bool Equal(const C &c1, const C &c2, CoordType epsilon=numeric_constants< CoordType >::epsilon())
Test for equality up to precision epsilon.
Definition: const.h:158
Generic library namespace.
Definition: atlasconv.h:45
const Point< dim > & endpoint(const int i) const
get one end of the segment
Definition: segment.h:77
A dim dimensional axis-aligned box.
Definition: axisbox.h:62
Segment(const Segment &s)
construct a copy of a segment
Definition: segment.h:53
A dim dimensional rotation matrix. Technically, a member of the group O(dim).
Definition: const.h:53
A dim dimensional box, lying at an arbitrary angle.
Definition: const.h:52
A polygon, all of whose points lie in a plane, embedded in dim dimensions.
Definition: const.h:51
Point< dim > Midpoint(const Point< dim > &p1, const Point< dim > &p2, CoordType dist=0.5)
Definition: point_funcs.h:240
Segment()
construct an uninitialized segment
Definition: segment.h:49
A dim dimensional vector.
Definition: const.h:55
float CoordType
Basic floating point type.
Definition: const.h:140
A line segment embedded in dim dimensions.
Definition: const.h:54
Point< dim > & endpoint(const int i)
get one end of the segment
Definition: segment.h:79
Segment(const Point< dim > &p1, const Point< dim > &p2)
construct a segment with endpoints p1 and p2
Definition: segment.h:51
A normalized quaterion.
Definition: quaternion.h:35
A dim dimensional point.
Definition: const.h:50
A dim dimensional ball.
Definition: ball.h:34