Code-Eli  0.3.6
piecewise_polygon_creator.hpp
Go to the documentation of this file.
1 /*********************************************************************************
2 * Copyright (c) 2013 David D. Marshall <ddmarsha@calpoly.edu>
3 *
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *
9 * Contributors:
10 * David D. Marshall - initial code and implementation
11 ********************************************************************************/
12 
13 #ifndef eli_geom_curve_piecewise_polygon_creator_hpp
14 #define eli_geom_curve_piecewise_polygon_creator_hpp
15 
16 #include <vector>
17 
18 #include "eli/code_eli.hpp"
19 
23 
24 namespace eli
25 {
26  namespace geom
27  {
28  namespace curve
29  {
30  template<typename data__, unsigned short dim__, typename tol__>
31  class piecewise_polygon_creator : public piecewise_creator_base<data__, dim__, tol__>
32  {
33  public:
39 
40  piecewise_polygon_creator() : piecewise_creator_base<data_type, dim__, tolerance_type>(4, 0), corner(4) {}
41  piecewise_polygon_creator(const index_type &ns) : piecewise_creator_base<data_type, dim__, tolerance_type>(ns, 0), corner(ns) {}
43  : piecewise_creator_base<data_type, dim__, tolerance_type>(ppc), corner(ppc.corner) {}
45 
46  void set_corner(const point_type &c, const index_type &i)
47  {
48  if ((i>=0) && (i<static_cast<index_type>(corner.size())))
49  corner[i]=c;
50  else
51  assert(false);
52  }
53  point_type get_corner(const index_type &i) const
54  {
55  if ((i<0) || (i>=static_cast<index_type>(corner.size())))
56  {
57  return corner[0];
58  assert(false);
59  }
60  return corner[i];
61  }
62 
64  {
65  typedef piecewise<bezier, data_type, dim__, tolerance_type> piecewise_curve_type;
66  typedef typename piecewise_curve_type::curve_type curve_type;
67  typedef typename piecewise_curve_type::error_code error_code;
68 
69  pc.clear();
70 
71  curve_type c(1);
72  error_code err;
73  index_type nsegs(this->get_number_segments());
74 
75  // do sanity check
76  if (corner.size()!=static_cast<size_t>(nsegs))
77  {
78  assert(false);
79  return false;
80  }
81 
82  // set the start parameter
83  pc.set_t0(this->get_t0());
84 
85  // set the first n-1 edges
86  for (index_type i=0; i<(nsegs-1); ++i)
87  {
88  c.set_control_point(corner[i], 0);
89  c.set_control_point(corner[i+1], 1);
90  err=pc.push_back(c, this->get_segment_dt(i));
91  if (err!=piecewise_curve_type::NO_ERRORS)
92  {
93  pc.clear();
94  pc.set_t0(0);
95  return false;
96  }
97  }
98 
99  // set the last edge
100  c.set_control_point(corner[corner.size()-1], 0);
101  c.set_control_point(corner[0], 1);
102  err=pc.push_back(c, this->get_segment_dt(nsegs-1));
103  if (err!=piecewise_curve_type::NO_ERRORS)
104  {
105  pc.clear();
106  pc.set_t0(0);
107  return false;
108  }
109 
110  assert(pc.closed());
111  return true;
112  }
113 
114  private:
116 
117  private:
118  std::vector<point_type, Eigen::aligned_allocator<point_type>> corner;
119  };
120  }
121  }
122 }
123 #endif
data__ data_type
Definition: piecewise_creator_base.hpp:33
Definition: math.hpp:20
error_code push_back(const curve_type &curve, const data_type &dt=1.0)
Definition: piecewise.hpp:688
Definition: piecewise_polygon_creator.hpp:31
bool closed() const
Definition: piecewise.hpp:501
Definition: piecewise.hpp:244
Eigen::Matrix< data_type, 1, dim__ > point_type
Definition: piecewise_creator_base.hpp:34
base_class_type::index_type index_type
Definition: piecewise_polygon_creator.hpp:37
index_type get_number_segments() const
Definition: piecewise_creator_base.hpp:47
piecewise_polygon_creator(const index_type &ns)
Definition: piecewise_polygon_creator.hpp:41
base_class_type::point_type point_type
Definition: piecewise_polygon_creator.hpp:36
void set_corner(const point_type &c, const index_type &i)
Definition: piecewise_polygon_creator.hpp:46
data_type get_segment_dt(const index_type &i) const
Definition: piecewise_creator_base.hpp:78
void clear()
Definition: piecewise.hpp:599
void number_segments_changed()
Definition: piecewise_polygon_creator.hpp:115
tol__ tolerance_type
Definition: piecewise_creator_base.hpp:36
point_type get_corner(const index_type &i) const
Definition: piecewise_polygon_creator.hpp:53
~piecewise_polygon_creator()
Definition: piecewise_polygon_creator.hpp:44
void set_t0(const data_type &t0_in)
Definition: piecewise.hpp:340
std::vector< point_type, Eigen::aligned_allocator< point_type > > corner
Definition: piecewise_polygon_creator.hpp:118
data_type get_t0() const
Definition: piecewise_creator_base.hpp:62
point_type::Index index_type
Definition: piecewise_creator_base.hpp:35
piecewise_polygon_creator()
Definition: piecewise_polygon_creator.hpp:40
piecewise_creator_base< data__, dim__, tol__ > base_class_type
Definition: piecewise_polygon_creator.hpp:34
piecewise_polygon_creator(const piecewise_polygon_creator< data_type, dim__, tolerance_type > &ppc)
Definition: piecewise_polygon_creator.hpp:42
base_class_type::tolerance_type tolerance_type
Definition: piecewise_polygon_creator.hpp:38
virtual bool create(piecewise< bezier, data_type, dim__, tolerance_type > &pc) const
Definition: piecewise_polygon_creator.hpp:63
Definition: piecewise_creator_base.hpp:30
base_class_type::data_type data_type
Definition: piecewise_polygon_creator.hpp:35