KJB
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
m2_spline.h
Go to the documentation of this file.
1 
2 /* $Id: m2_spline.h 18244 2014-11-19 23:03:32Z ksimek $ */
3 
4 #ifndef KJB_SPLINE_H
5 #define KJB_SPLINE_H
6 
7 #include <l_cpp/l_cloneable.h>
8 #include <m_cpp/m_vector.h>
9 #include <g_cpp/g_quaternion.h>
10 #include <vector>
11 
27 namespace kjb {
28 
34 class Spline_curve : public virtual Cloneable
35 {
36 public:
37  virtual Vector evaluate(double u) const = 0;
38  virtual Vector gradient(double u) const = 0;
39 };
40 
46 class Spline_surface : public virtual Cloneable
47 {
48 public:
49  virtual Vector evaluate(double s, double t) const = 0;
50 };
51 
52 
59 class Nurbs_curve : public Spline_curve
60 {
61 public:
62  Nurbs_curve();
63  Nurbs_curve(uint num_knots, const float* knots, uint degree, const std::vector<Vector>& ctl_points);
64  Nurbs_curve(const Nurbs_curve& src);
65  virtual ~Nurbs_curve();
66 
67  void insert_at(int index, const Vector& control_point);
68 
69  virtual Nurbs_curve& operator=(const Nurbs_curve& src);
70  virtual Nurbs_curve* clone() const;
71 
72  kjb::Vector evaluate(double u) const;
73  kjb::Vector gradient(double u) const;
74 
75  bool has_zero_length() const;
76 protected:
77  uint _order;
78 
79  uint _num_knots;
80  float* _knots;
81 
82  std::vector<Vector> _ctl_points;
83 
84 private:
85  double _dN(int n, int d, double t) const;
86  double _N(int n, int d, double t) const;
87 };
88 
89 
90 
98 {
99  public:
100  Nurbs_surface();
102  uint num_knots_s,
103  const float* knots_s,
104  uint num_knots_t,
105  const float* knots_t,
106  uint degree_u,
107  uint degree_v,
108  const std::vector<std::vector<Vector> >& ctl_points);
109 
110  Nurbs_surface( const Nurbs_surface& other );
111  ~Nurbs_surface();
112 
113 
114  Vector gradient_s(double s, double t) const;
115  Vector gradient_t(double s, double t) const;
116  Vector normal(double s, double t) const;
117 
118  Vector evaluate(double s, double t) const;
119 
120 
121  virtual Nurbs_surface& operator=(const Nurbs_surface& src);
122  virtual Nurbs_surface* clone() const;
123 
124  virtual double& operator()(uint u, uint v, uint d)
125  {
126  return _ctl_points[u][v][d];
127  }
128 
129  virtual double operator()(uint u, uint v, uint d) const
130  {
131  return _ctl_points[u][v][d];
132  }
133  protected:
134  uint _order_s;
135  uint _order_t;
138  float* _knots_s;
139  float* _knots_t;
140  std::vector< std::vector<Vector> > _ctl_points;
141 
142  private:
143  void _print() const;
144 
145 }; // class Nurbs_surface
146 
147 
148 
154 {
155 public:
156  Bezier_curve(int degree = 3, int dimension = 3);
157  Bezier_curve(const Bezier_curve& src);
158  virtual ~Bezier_curve(){}
159 
160  Bezier_curve& operator=(const Bezier_curve& src);
161  virtual Bezier_curve* clone() const;
162 
168  kjb::Vector evaluate(double u) const;
169  kjb::Vector gradient(double u) const;
170 
171  void set_control_point(int index, const Vector& pt);
172 
173  const kjb::Vector& get_control_point(int index) const;
174 
176  Nurbs_curve to_nurbs() const;
177 private:
178  std::vector<Vector> _ctl_points;
179 };
180 
181 
193 {
194 public:
196 
198  Polybezier_curve(const std::vector<kjb::Vector>& control_points);
199 
200  Polybezier_curve* clone() const;
201 
202  static void decode_control_point(size_t i, size_t& curve_i, Point_type& point_type);
203  static size_t encode_control_point(size_t curve_i, Point_type point_type);
204 
205  size_t size() const;
206  size_t dimension() const;
207 
208  void swap(Polybezier_curve& other);
209 
215  kjb::Vector evaluate(double u) const;
216  kjb::Vector gradient(double u) const;
217 
218  void insert_curve_point(int index, const kjb::Vector& curve_pt);
219  void insert(int index, const kjb::Vector& curve_pt, const kjb::Vector& handle_pt_1, const kjb::Vector& handle_pt_2);
220 
221  void set_curve_point(int index, const kjb::Vector& pt);
222  void set_handle_point_1(int index, const kjb::Vector& pt);
223  void set_handle_point_2(int index, const kjb::Vector& pt);
224 
225 
226  void delete_curve_point(int index);
227 
228  void reverse();
229 
231  void symmetrize_handle_1(int index);
232  void symmetrize_handle_2(int index);
233 
234  kjb::Vector& get_curve_point(int index);
235  const kjb::Vector& get_curve_point(int index) const;
236 
237  kjb::Vector& get_handle_point_1(int index);
238  const kjb::Vector& get_handle_point_1(int index) const;
239 
240  kjb::Vector& get_handle_point_2(int index);
241  const kjb::Vector& get_handle_point_2(int index) const;
242 
243  kjb::Vector& get_control_point(int index);
244  const kjb::Vector& get_control_point(int index) const;
245 
247  virtual Nurbs_curve to_nurbs() const;
248 
249 #ifdef DEBUG
250 
251  void print_svg() const;
252 #endif
253  friend bool operator==(const Polybezier_curve& op1, const Polybezier_curve& op2);
254 private:
255  std::vector<kjb::Vector> _curve_points;
256  std::vector<kjb::Vector> _handle_1_points;
257  std::vector<kjb::Vector> _handle_2_points;
258 
259  int _dimension;
260 };
261 
262 Polybezier_curve subdivide(const Polybezier_curve& curve, double u);
263 
264 bool operator==(const Polybezier_curve& op1, const Polybezier_curve& op2);
265 
266 }
267 
268 #endif
Point_type
Definition: m2_spline.h:195
kjb::Vector & get_handle_point_2(int index)
Definition: m2_spline.cpp:849
void symmetrize_handle_1(int index)
Definition: m2_spline.cpp:943
virtual Vector evaluate(double s, double t) const =0
Vector gradient_s(double s, double t) const
Definition: m2_spline.cpp:442
float * _knots_t
Definition: m2_spline.h:139
void insert(int index, const kjb::Vector &curve_pt, const kjb::Vector &handle_pt_1, const kjb::Vector &handle_pt_2)
Definition: m2_spline.cpp:816
void insert_at(int index, const Vector &control_point)
Definition: m2_spline.cpp:84
virtual Nurbs_surface & operator=(const Nurbs_surface &src)
Definition: m2_spline.cpp:411
void insert_curve_point(int index, const kjb::Vector &curve_pt)
Definition: m2_spline.cpp:804
Definition: m2_spline.h:97
uint _num_knots_t
Definition: m2_spline.h:137
Definition: m2_spline.h:153
const kjb::Vector & get_control_point(int index) const
Definition: m2_spline.cpp:658
Nurbs_curve to_nurbs() const
Convert to a mathematically equivalent nurbs curve.
Definition: m2_spline.cpp:663
Bezier_curve & operator=(const Bezier_curve &src)
Definition: m2_spline.cpp:615
Nurbs_surface()
Definition: m2_spline.cpp:323
kjb::Vector gradient(double u) const
Definition: m2_spline.cpp:634
Definition: m2_spline.h:59
void delete_curve_point(int index)
Definition: m2_spline.cpp:921
kjb::Vector & get_handle_point_1(int index)
Definition: m2_spline.cpp:839
virtual Bezier_curve * clone() const
Processes an Option from program command-line arguments.
Definition: m2_spline.cpp:621
kjb::Vector gradient(double u) const
Definition: m2_spline.cpp:164
virtual Nurbs_curve & operator=(const Nurbs_curve &src)
Definition: m2_spline.cpp:90
kjb::Vector evaluate(double u) const
Definition: m2_spline.cpp:750
This class implements vectors, in the linear-algebra sense, with real-valued elements.
Definition: m_vector.h:87
uint _num_knots_s
Definition: m2_spline.h:136
size_t dimension() const
Definition: m2_spline.cpp:745
Bezier_curve(int degree=3, int dimension=3)
Definition: m2_spline.cpp:600
virtual Nurbs_curve * clone() const
Processes an Option from program command-line arguments.
Definition: m2_spline.cpp:108
virtual Vector evaluate(double u) const =0
Definition: m2_spline.h:192
virtual double operator()(uint u, uint v, uint d) const
Definition: m2_spline.h:129
virtual Vector gradient(double u) const =0
uint _order
Definition: m2_spline.h:77
Abstract class to clone this object.
Definition: l_cloneable.h:45
void set_control_point(int index, const Vector &pt)
Definition: m2_spline.cpp:643
Definition: m2_spline.h:195
Definition: m2_spline.h:195
kjb::Vector & get_curve_point(int index)
Definition: m2_spline.cpp:829
virtual Nurbs_curve to_nurbs() const
Convert to a mathematically equivalent nurbs curve.
Definition: m2_spline.cpp:978
virtual double & operator()(uint u, uint v, uint d)
Definition: m2_spline.h:124
bool has_zero_length() const
Definition: m2_spline.cpp:190
static size_t encode_control_point(size_t curve_i, Point_type point_type)
Definition: m2_spline.cpp:119
void set_handle_point_1(int index, const kjb::Vector &pt)
Definition: m2_spline.cpp:901
kjb::Vector gradient(double u) const
Definition: m2_spline.cpp:799
Definition: m2_spline.h:34
Vector gradient_t(double s, double t) const
Definition: m2_spline.cpp:491
float * _knots_s
Definition: m2_spline.h:138
void set_handle_point_2(int index, const kjb::Vector &pt)
Definition: m2_spline.cpp:911
virtual ~Nurbs_curve()
Definition: m2_spline.cpp:79
virtual Nurbs_surface * clone() const
Processes an Option from program command-line arguments.
Definition: m2_spline.cpp:434
std::vector< std::vector< Vector > > _ctl_points
Definition: m2_spline.h:140
Abstract class to clone this object.
uint _order_t
Definition: m2_spline.h:135
static void decode_control_point(size_t i, size_t &curve_i, Point_type &point_type)
Definition: m2_spline.cpp:113
virtual ~Bezier_curve()
Definition: m2_spline.h:158
~Nurbs_surface()
Definition: m2_spline.cpp:405
bool operator==(const Int_matrix &op1, const Int_matrix::Impl_type &op2)
Test for exact equality between two matrices.
Definition: l_int_matrix.cpp:218
Polybezier_curve subdivide(const Polybezier_curve &c, double u)
Definition: m2_spline.cpp:1112
void swap(Polybezier_curve &other)
Definition: m2_spline.cpp:1104
Vector evaluate(double s, double t) const
Definition: m2_spline.cpp:558
Vector normal(double s, double t) const
Definition: m2_spline.cpp:547
size_t size() const
Definition: m2_spline.cpp:740
friend bool operator==(const Polybezier_curve &op1, const Polybezier_curve &op2)
Definition: m2_spline.cpp:1077
void reverse()
Definition: m2_spline.cpp:931
float * _knots
Definition: m2_spline.h:80
kjb::Vector evaluate(double u) const
Definition: m2_spline.cpp:626
uint _num_knots
Definition: m2_spline.h:79
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
Definition: m2_spline.h:195
Definition: m2_spline.h:46
std::vector< Vector > _ctl_points
Definition: m2_spline.h:82
kjb::Vector evaluate(double u) const
Definition: m2_spline.cpp:138
void set_curve_point(int index, const kjb::Vector &pt)
Definition: m2_spline.cpp:896
Polybezier_curve(int dimension)
Definition: m2_spline.cpp:683
Definition for the Vector class, a thin wrapper on the KJB Vector struct and its related functionalit...
void symmetrize_handle_2(int index)
Definition: m2_spline.cpp:963
Polybezier_curve * clone() const
Processes an Option from program command-line arguments.
Definition: m2_spline.cpp:735
uint _order_s
Definition: m2_spline.h:134
kjb::Vector & get_control_point(int index)
Definition: m2_spline.cpp:859
Nurbs_curve()
Definition: m2_spline.cpp:20