13 #ifndef eli_geom_curve_piecewise_superellipse_creator_hpp
14 #define eli_geom_curve_piecewise_superellipse_creator_hpp
16 #include "eli/code_eli.hpp"
28 template<
typename data__,
unsigned short dim__,
typename tol__>
54 virtual void fun(point_type &f,
const data_type &t)
const = 0;
55 virtual void fun(point_type &f, point_type &fp,
const data_type &t)
const = 0;
62 template<
typename data__,
unsigned short dim__,
typename tol__>
77 void set_axis(
const data_type &aa,
const data_type &bb)
82 void get_axis(data_type &aa, data_type &bb)
const
147 typedef typename piecewise_curve_type::curve_type curve_type;
148 typedef typename piecewise_curve_type::control_point_type control_point_type;
149 typedef typename piecewise_curve_type::error_code error_code;
150 typedef typename curve_type::fit_container_type fit_container_type;
169 piecewise_curve_type pc_bottom;
170 index_type iseg, nseg_top(nsegs/2);
175 piecewise_curve_type pc_left;
176 index_type nseg_first(nseg_top/2), nsample_pts(nseg_first*(
max_degree)+1);
177 std::vector<point_type> f(nsample_pts);
182 f[nsample_pts-1].setZero();
183 f[nsample_pts-1].y()=
b;
186 for (index_type i=1; i<(nsample_pts-1); ++i)
188 data_type t, argx, argy, tmp;
192 tmp=
static_cast<data_type
>(i)/(nsample_pts-1);
193 argx=std::pow(1-tmp,
m/2);
194 argx=std::min(argx, static_cast<data_type>(1));
195 argx=std::max(argx, static_cast<data_type>(0));
196 argy=std::pow(tmp,
n/2);
197 argy=std::min(argy, static_cast<data_type>(1));
198 argy=std::max(argy, static_cast<data_type>(0));
207 for (iseg=0; iseg<nseg_first; ++iseg)
209 control_point_type cp;
210 fit_container_type fcon;
215 crv.interpolate(fcon);
220 bool need_set(
false);
221 control_point_type cp(crv.get_control_point(1));
235 crv.set_control_point(cp, 1);
240 if (iseg==(nseg_first-1))
242 bool need_set(
false);
243 control_point_type cp(crv.get_control_point(
max_degree-1));
262 if (err!=piecewise_curve_type::NO_ERRORS)
264 std::cout <<
"error number: " << err << std::endl;
287 for (iseg=0; iseg<pc_left.number_segments(); ++iseg)
289 pc_left.get(c, iseg);
291 if (err!=piecewise_curve_type::NO_ERRORS)
293 std::cout <<
"error number: " << err << std::endl;
304 index_type nsample_pts(nseg_top*(
max_degree)+1), nhalf(nsample_pts/2);
305 std::vector<point_type> f(nsample_pts);
310 f[nsample_pts-1].setZero();
311 f[nsample_pts-1].x()=-
a;
312 if (nsample_pts%2==1)
319 for (index_type i=1; i<nhalf; ++i)
321 data_type t, argx, argy, tmp;
325 tmp=
static_cast<data_type
>(i)/(nhalf);
326 argx=std::pow(1-tmp,
m/2);
327 argx=std::min(argx, static_cast<data_type>(1));
328 argx=std::max(argx, static_cast<data_type>(0));
329 argy=std::pow(tmp,
n/2);
330 argy=std::min(argy, static_cast<data_type>(1));
331 argy=std::max(argy, static_cast<data_type>(0));
338 fun(f[nsample_pts-i-1], static_cast<data_type>(0.5)-t);
350 for (iseg=0; iseg<nseg_top; ++iseg)
352 control_point_type cp;
353 fit_container_type fcon;
358 crv.interpolate(fcon);
363 bool need_set(
false);
364 control_point_type cp(crv.get_control_point(1));
378 crv.set_control_point(cp, 1);
383 if (iseg==(nseg_top-1))
385 bool need_set(
false);
386 control_point_type cp(crv.get_control_point(
max_degree-1));
405 if (err!=piecewise_curve_type::NO_ERRORS)
407 std::cout <<
"error number: " << err << std::endl;
424 for (iseg=0; iseg<pc_bottom.number_segments(); ++iseg)
426 pc_bottom.get(c, iseg);
428 if (err!=piecewise_curve_type::NO_ERRORS)
430 std::cout <<
"error number: " << err << std::endl;
480 virtual void fun(point_type &f,
const data_type &t)
const
490 data_type sign_cos(1), sign_sin(1);
492 if ((t>0.25) && (t<0.5))
496 else if ((t>0.5) && (t>0.75))
507 data_type abs_cos(std::abs(std::cos(theta)));
508 data_type abs_sin(std::abs(std::sin(theta)));
511 f.x()=
a*sign_cos*std::pow(abs_cos, 2/
m);
512 f.y()=
b*sign_sin*std::pow(abs_sin, 2/
n);
515 virtual void fun(point_type &f, point_type &fp,
const data_type &t)
const
526 data_type sign_cos(1), sign_sin(1);
528 if ((t>0.25) && (t<0.5))
532 else if ((t>0.5) && (t>0.75))
543 data_type abs_cos(std::abs(std::cos(theta)));
544 data_type abs_sin(std::abs(std::sin(theta)));
547 f.x()=
a*sign_cos*std::pow(abs_cos, 2/
m);
548 f.y()=
b*sign_sin*std::pow(abs_sin, 2/
n);
void get_exponents(data_type &mm, data_type &nn) const
Definition: piecewise_superellipse_creator.hpp:111
void set_b_axis(const data_type &bb)
Definition: piecewise_superellipse_creator.hpp:97
virtual void fun(point_type &f, point_type &fp, const data_type &t) const
Definition: piecewise_superellipse_creator.hpp:515
piecewise_2d_curve_creator(const piecewise_2d_curve_creator< data_type, dim__, tolerance_type > &p2dc)
Definition: piecewise_superellipse_creator.hpp:46
virtual bool create(piecewise< bezier, data_type, dim__, tolerance_type > &pc) const
Definition: piecewise_superellipse_creator.hpp:144
void get_axis(data_type &aa, data_type &bb) const
Definition: piecewise_superellipse_creator.hpp:82
data__ data_type
Definition: piecewise_creator_base.hpp:33
const data_type & get_n_exponent() const
Definition: piecewise_superellipse_creator.hpp:133
data_type a
Definition: piecewise_superellipse_creator.hpp:558
piecewise_2d_curve_creator< data__, dim__, tol__ >::tolerance_type tolerance_type
Definition: piecewise_superellipse_creator.hpp:69
void set_max_degree(const index_type &md)
Definition: piecewise_superellipse_creator.hpp:135
point_type get_origin() const
Definition: piecewise_superellipse_creator.hpp:51
error_code push_back(const curve_type &curve, const data_type &dt=1.0)
Definition: piecewise.hpp:688
const data_type & get_b_axis() const
Definition: piecewise_superellipse_creator.hpp:104
const data_type & get_y_radius() const
Definition: piecewise_superellipse_creator.hpp:476
piecewise_2d_curve_creator(const index_type &ns, const data_type &tt0)
Definition: piecewise_superellipse_creator.hpp:42
index_type number_segments() const
Definition: piecewise.hpp:419
void set_exponents(const data_type &mm, const data_type &nn)
Definition: piecewise_superellipse_creator.hpp:106
void reflect_xz()
Definition: piecewise.hpp:559
void set_n_exponent(const data_type &nn)
Definition: piecewise_superellipse_creator.hpp:126
piecewise_superellipse_creator(const index_type &ns)
Definition: piecewise_superellipse_creator.hpp:72
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_superellipse_creator.hpp:32
piecewise_superellipse_creator(const piecewise_superellipse_creator< data_type, dim__, tolerance_type > &ppc)
Definition: piecewise_superellipse_creator.hpp:73
index_type max_degree
Definition: piecewise_superellipse_creator.hpp:559
data_type yradius
Definition: piecewise_superellipse_creator.hpp:556
index_type get_number_segments() const
Definition: piecewise_creator_base.hpp:47
point_type origin
Definition: piecewise_superellipse_creator.hpp:58
piecewise_superellipse_creator()
Definition: piecewise_superellipse_creator.hpp:71
void translate(const point_type &trans)
Definition: piecewise.hpp:491
void set_m_exponent(const data_type &mm)
Definition: piecewise_superellipse_creator.hpp:117
data_type m
Definition: piecewise_superellipse_creator.hpp:558
void set_a_axis(const data_type &aa)
Definition: piecewise_superellipse_creator.hpp:88
const data_type & get_m_exponent() const
Definition: piecewise_superellipse_creator.hpp:124
const data_type & get_x_radius() const
Definition: piecewise_superellipse_creator.hpp:464
~piecewise_2d_curve_creator()
Definition: piecewise_superellipse_creator.hpp:48
piecewise_2d_curve_creator< data__, dim__, tol__ >::index_type index_type
Definition: piecewise_superellipse_creator.hpp:67
base_class_type::point_type point_type
Definition: piecewise_superellipse_creator.hpp:34
data_type xradius
Definition: piecewise_superellipse_creator.hpp:556
piecewise_2d_curve_creator< data__, dim__, tol__ >::point_type point_type
Definition: piecewise_superellipse_creator.hpp:68
data_type get_segment_dt(const index_type &i) const
Definition: piecewise_creator_base.hpp:78
void clear()
Definition: piecewise.hpp:599
piecewise_2d_curve_creator()
Definition: piecewise_superellipse_creator.hpp:38
virtual void fun(point_type &f, const data_type &t) const
Definition: piecewise_superellipse_creator.hpp:480
void set_x_radius(const data_type &xr)
Definition: piecewise_superellipse_creator.hpp:453
tol__ tolerance_type
Definition: piecewise_creator_base.hpp:36
void set_origin(const point_type &orig)
Definition: piecewise_superellipse_creator.hpp:50
void set_axis(const data_type &aa, const data_type &bb)
Definition: piecewise_superellipse_creator.hpp:77
virtual void fun(point_type &f, const data_type &t) const =0
void set_t0(const data_type &t0_in)
Definition: piecewise.hpp:340
void set_y_radius(const data_type &yr)
Definition: piecewise_superellipse_creator.hpp:465
base_class_type::data_type data_type
Definition: piecewise_superellipse_creator.hpp:33
index_type get_max_degree() const
Definition: piecewise_superellipse_creator.hpp:142
data_type get_t0() const
Definition: piecewise_creator_base.hpp:62
base_class_type::index_type index_type
Definition: piecewise_superellipse_creator.hpp:35
point_type::Index index_type
Definition: piecewise_creator_base.hpp:35
void reflect_yz()
Definition: piecewise.hpp:569
piecewise_2d_curve_creator< data__, dim__, tol__ >::data_type data_type
Definition: piecewise_superellipse_creator.hpp:66
data_type b
Definition: piecewise_superellipse_creator.hpp:558
Definition: piecewise_superellipse_creator.hpp:63
~piecewise_superellipse_creator()
Definition: piecewise_superellipse_creator.hpp:75
data_type n
Definition: piecewise_superellipse_creator.hpp:558
base_class_type::tolerance_type tolerance_type
Definition: piecewise_superellipse_creator.hpp:36
Definition: piecewise_superellipse_creator.hpp:29
Definition: piecewise_creator_base.hpp:30
const data_type & get_a_axis() const
Definition: piecewise_superellipse_creator.hpp:95