1 #ifndef VTESTBED_GEOMETRY_POLYGON_HH 2 #define VTESTBED_GEOMETRY_POLYGON_HH 8 #include <vtestbed/geometry/line_segment.hh> 9 #include <vtestbed/geometry/math.hh> 10 #include <vtestbed/geometry/plane.hh> 11 #include <vtestbed/geometry/types.hh> 17 template <
class T,
int N>
24 using scalar_type = T;
25 static constexpr
const int dimensions = N;
26 using value_type =
typename base_type::value_type;
27 using pointer =
typename base_type::pointer;
28 using const_pointer =
typename base_type::const_pointer;
29 using reference =
typename base_type::reference;
30 using const_reference =
typename base_type::const_reference;
31 using iterator =
typename base_type::iterator;
32 using const_iterator =
typename base_type::const_iterator;
33 using size_type =
typename base_type::size_type;
34 using difference_type =
typename base_type::difference_type;
35 using reverse_iterator =
typename base_type::reverse_iterator;
36 using const_reverse_iterator =
typename base_type::const_reverse_iterator;
41 using base_type::base_type;
42 using base_type::operator=;
43 using base_type::operator[];
47 return !this->empty() && all(this->front() == this->back());
52 if (this->empty()) {
return; }
53 if (all(this->front() == this->back())) {
return; }
54 this->emplace_back(this->front());
58 find(
const value_type& vertex)
const {
59 const auto& vertices = *
this;
60 const auto nvertices = vertices.size();
61 for (
size_t i=0; i<nvertices; ++i) {
62 const auto& v = vertices[i];
63 if (all(v == vertex)) {
70 inline void flip() { std::reverse(this->begin(), this->end()); }
74 bool degenerate(scalar_type eps)
const;
87 void gift_wrap(scalar_type eps, size_type count);
92 template <
class T,
int N>
95 template <
class T> Vertex<T,2> centroid(
const Polygon<T,2>& p);
101 #endif // vim:filetype=cpp
A polygon composed of line segments.
triangle_array triangles() const
Uses ear-clipping triangulation.
Three- and two-dimensional plane.