Code-Eli  0.3.6
piecewise_linear_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_linear_creator_hpp
14 #define eli_geom_curve_piecewise_linear_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_linear_creator : public piecewise_creator_base<data__, dim__, tol__>
32  {
33  public:
39 
40  piecewise_linear_creator() : piecewise_creator_base<data_type, dim__, tolerance_type>(2, 0), corner(3) {}
41  piecewise_linear_creator(const index_type &ns) : piecewise_creator_base<data_type, dim__, tolerance_type>(ns, 0), corner(ns+1) {}
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+1))
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 edges
86  for (index_type i=0; i<nsegs; ++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  return true;
100  }
101 
102  private:
104 
105  private:
106  std::vector<point_type, Eigen::aligned_allocator<point_type>> corner;
107  };
108  }
109  }
110 }
111 #endif
std::vector< point_type, Eigen::aligned_allocator< point_type > > corner
Definition: piecewise_linear_creator.hpp:106
base_class_type::data_type data_type
Definition: piecewise_linear_creator.hpp:35
data__ data_type
Definition: piecewise_creator_base.hpp:33
Definition: math.hpp:20
base_class_type::point_type point_type
Definition: piecewise_linear_creator.hpp:36
Definition: piecewise_linear_creator.hpp:31
piecewise_linear_creator(const piecewise_linear_creator< data_type, dim__, tolerance_type > &ppc)
Definition: piecewise_linear_creator.hpp:42
error_code push_back(const curve_type &curve, const data_type &dt=1.0)
Definition: piecewise.hpp:688
piecewise_linear_creator()
Definition: piecewise_linear_creator.hpp:40
Definition: piecewise.hpp:244
Eigen::Matrix< data_type, 1, dim__ > point_type
Definition: piecewise_creator_base.hpp:34
piecewise_creator_base< data__, dim__, tol__ > base_class_type
Definition: piecewise_linear_creator.hpp:34
void number_segments_changed()
Definition: piecewise_linear_creator.hpp:103
base_class_type::tolerance_type tolerance_type
Definition: piecewise_linear_creator.hpp:38
index_type get_number_segments() const
Definition: piecewise_creator_base.hpp:47
virtual bool create(piecewise< bezier, data_type, dim__, tolerance_type > &pc) const
Definition: piecewise_linear_creator.hpp:63
~piecewise_linear_creator()
Definition: piecewise_linear_creator.hpp:44
data_type get_segment_dt(const index_type &i) const
Definition: piecewise_creator_base.hpp:78
void clear()
Definition: piecewise.hpp:599
void set_corner(const point_type &c, const index_type &i)
Definition: piecewise_linear_creator.hpp:46
base_class_type::index_type index_type
Definition: piecewise_linear_creator.hpp:37
tol__ tolerance_type
Definition: piecewise_creator_base.hpp:36
point_type get_corner(const index_type &i) const
Definition: piecewise_linear_creator.hpp:53
void set_t0(const data_type &t0_in)
Definition: piecewise.hpp:340
data_type get_t0() const
Definition: piecewise_creator_base.hpp:62
point_type::Index index_type
Definition: piecewise_creator_base.hpp:35
piecewise_linear_creator(const index_type &ns)
Definition: piecewise_linear_creator.hpp:41
Definition: piecewise_creator_base.hpp:30