1 #ifndef VTESTBED_GEOMETRY_LINE_SEGMENT_HH 2 #define VTESTBED_GEOMETRY_LINE_SEGMENT_HH 7 #include <vtestbed/geometry/plane.hh> 8 #include <vtestbed/geometry/types.hh> 9 #include <vtestbed/geometry/vertex.hh> 15 template <
class T,
int N>
22 static constexpr
const int dimensions = N;
23 using scalar_type = T;
24 using value_type =
typename base_type::value_type;
25 using pointer =
typename base_type::pointer;
26 using const_pointer =
typename base_type::const_pointer;
27 using reference =
typename base_type::reference;
28 using const_reference =
typename base_type::const_reference;
29 using iterator =
typename base_type::iterator;
30 using const_iterator =
typename base_type::const_iterator;
31 using size_type =
typename base_type::size_type;
32 using difference_type =
typename base_type::difference_type;
33 using reverse_iterator =
typename base_type::reverse_iterator;
34 using const_reverse_iterator =
typename base_type::const_reverse_iterator;
38 using base_type::base_type;
39 using base_type::operator=;
40 using base_type::operator[];
47 border_contains(const_reference v)
const {
48 return all(this->front() == v) || all(this->back() == v);
52 border_contains(const_reference v, scalar_type eps)
const {
53 return near(this->front(), v, eps) || near(this->back(), v, eps);
57 interior_contains(const_reference v, T eps)
const {
58 return !this->border_contains(v) && this->contains(v, eps);
62 degenerate(scalar_type eps)
const {
63 return near(this->front(), this->back(), eps);
69 swap(this->front(), this->back());
72 inline scalar_type length()
const {
return distance(this->front(), this->back()); }
73 inline value_type centre()
const {
return T{0.5}*(this->front()+this->back()); }
75 bool contains(const_reference c, T eps)
const;
78 inline void invert() { std::swap(this->front(), this->back()); }
84 template <
class T,
int N>
87 return near(lhs.front(), rhs.front(), eps) &&
88 near(lhs.back(), rhs.back(), eps);
91 template <
class T,
int N>
93 operator<(
const Line_segment<T,N>& lhs,
const Line_segment<T,N>& rhs) {
94 Compare_vertex<T,N> cmp;
95 return cmp(lhs.back(), rhs.front());
98 template <
class T,
int N>
100 operator==(
const Line_segment<T,N>& lhs,
const Line_segment<T,N>& rhs) {
101 return all(lhs.front() == rhs.front()) &&
102 all(lhs.back() == rhs.back());
105 template <
class T,
int N>
107 operator!=(
const Line_segment<T,N>& lhs,
const Line_segment<T,N>& rhs) {
108 return !operator==(lhs, rhs);
111 template <
class T,
int N>
112 inline Vertex<Plane_position,2>
113 compare(
const Plane<T,N> plane,
const Line_segment<T,N>& s, T eps) {
114 return {compare(plane, s[0], eps), compare(plane, s[1], eps)};
117 template <
class T,
int N>
120 const Plane<T,N>& plane,
121 const Line_segment<T,N>& segment
124 template <
int dim,
class T,
int N>
126 intersection_point(
const Line_segment<T,N>& segment, T level) {
127 const auto& a = segment.front();
128 const auto& b = segment.back();
129 Vertex<T,N> extent = b - a;
130 T s = (level - a(dim)) / extent(dim);
134 template <
class T,
int N>
137 template <
class T,
int N>
145 #endif // vim:filetype=cpp
Three- and two-dimensional plane.