13 #ifndef eli_geom_curve_piecewise_circle_creator_hpp
14 #define eli_geom_curve_piecewise_circle_creator_hpp
18 #include "eli/code_eli.hpp"
36 template<
typename data__>
37 void calculate_circle(data__ &rad, data__ &x0, data__ &y0,
const data__ &xa,
const data__ &ya,
38 const data__ &xb,
const data__ &yb,
const data__ &xc,
const data__ &yc)
40 data__ denom, xamb, yamb, xcma, ycma, xbmc, ybmc, alen2, blen2, clen2;
52 denom=2*(xc*yamb+xb*ycma+xa*ybmc);
53 rad=std::sqrt((xamb*xamb+yamb*yamb)*(xcma*xcma+ycma*ycma)*(xbmc*xbmc+ybmc*ybmc))/denom;
54 x0= (clen2*yamb+blen2*ycma+alen2*ybmc)/denom;
55 y0=-(clen2*xamb+blen2*xcma+alen2*xbmc)/denom;
59 template<
typename data__,
unsigned short dim__,
typename tol__>
92 if (tol.approximately_equal(xdir.dot(ydir), 0))
113 typedef typename piecewise_curve_type::curve_type curve_type;
114 typedef typename piecewise_curve_type::error_code error_code;
115 typedef typename curve_type::control_point_type control_point_type;
120 control_point_type cp[4];
148 c.set_control_point(cp[i], i);
151 if (err!=piecewise_curve_type::NO_ERRORS)
165 c.set_control_point(cp[i], i);
168 if (err!=piecewise_curve_type::NO_ERRORS)
182 c.set_control_point(cp[i], i);
185 if (err!=piecewise_curve_type::NO_ERRORS)
199 c.set_control_point(cp[i], i);
202 if (err!=piecewise_curve_type::NO_ERRORS)
243 template<
typename data__,
unsigned short dim__,
typename tol__>
262 if (tol.approximately_equal(r, 0))
283 void set(
const point_type &orig,
const point_type &
x,
const point_type &
y,
const data_type &r)
290 void set(
const point_type &start,
const point_type &orig)
295 if (start.col(2)!=orig.col(2))
328 void set(
const point_type &start,
const point_type &orig,
const point_type &normal)
352 y << normal(1)*
x(2)-normal(2)*
x(1),
353 normal(2)*
x(0)-normal(0)*
x(2),
354 normal(0)*
x(1)-normal(1)*
x(0);
358 point_type n(normal);
361 assert(tol.approximately_equal(x.dot(n), 0));
367 void set_3pt(
const point_type &start,
const point_type &middle,
const point_type &end)
372 if ( tol.approximately_equal(start, end)
373 || tol.approximately_equal(start, middle)
374 || tol.approximately_equal(middle, end) )
386 middle.x(), middle.y(), end.x(), end.y());
391 point_type orig, normal, xtmp, ytmp;
399 normal << xtmp(1)*ytmp(2)-xtmp(2)*ytmp(1),
400 xtmp(2)*ytmp(0)-xtmp(0)*ytmp(2),
401 xtmp(0)*ytmp(1)-xtmp(1)*ytmp(0);
405 ytmp << normal(1)*xtmp(2)-normal(2)*xtmp(1),
406 normal(2)*xtmp(0)-normal(0)*xtmp(2),
407 normal(0)*xtmp(1)-normal(1)*xtmp(0);
411 data_type r, x0, y0, xa, ya, xb, yb, xc, yc;
427 orig=x0*xtmp+y0*ytmp+start;
428 set(start, orig, normal);
434 template<
typename data__,
unsigned short dim__,
typename tol__>
453 if (tol.approximately_equal(xr, 0))
475 if (tol.approximately_equal(yr, 0))
493 void set(
const point_type &orig,
const point_type &
x,
const point_type &
y,
const data_type &xr,
const data_type &yr)
void set_x_axis_radius(const data_type &xr)
Definition: piecewise_circle_creator.hpp:449
tol__ tolerance_type
Definition: piecewise_circle_creator.hpp:250
data__ data_type
Definition: piecewise_creator_base.hpp:33
Derived1__::Scalar distance(const Eigen::MatrixBase< Derived1__ > &p1, const Eigen::MatrixBase< Derived2__ > &p2)
Definition: distance.hpp:33
point_type y
Definition: piecewise_circle_creator.hpp:239
piecewise_ellipse_creator()
Definition: piecewise_circle_creator.hpp:444
piecewise_ellipse_creator(const piecewise_ellipse_creator< data_type, dim__, tolerance_type > &pcc)
Definition: piecewise_circle_creator.hpp:446
piecewise_creator_base< data__, dim__, tol__ > base_class_type
Definition: piecewise_circle_creator.hpp:63
void set_origin(const point_type &orig)
Definition: piecewise_circle_creator.hpp:85
data__ data_type
Definition: piecewise_circle_creator.hpp:247
data_type yradius
Definition: piecewise_circle_creator.hpp:240
base_class_type::data_type data_type
Definition: piecewise_circle_creator.hpp:64
virtual ~piecewise_ellipse_creator_base()
Definition: piecewise_circle_creator.hpp:83
base_class_type::tolerance_type tolerance_type
Definition: piecewise_circle_creator.hpp:67
const data_type & get_x_radius() const
Definition: piecewise_circle_creator.hpp:224
piecewise_ellipse_creator_base()
Definition: piecewise_circle_creator.hpp:70
error_code push_back(const curve_type &curve, const data_type &dt=1.0)
Definition: piecewise.hpp:688
void set_x_radius(const data_type &xr)
Definition: piecewise_circle_creator.hpp:213
Definition: piecewise_circle_creator.hpp:435
piecewise_circle_creator(const piecewise_circle_creator< data_type, dim__, tolerance_type > &pcc)
Definition: piecewise_circle_creator.hpp:255
const data_type & get_y_radius() const
Definition: piecewise_circle_creator.hpp:236
data__ data_type
Definition: piecewise_circle_creator.hpp:438
base_class_type::point_type point_type
Definition: piecewise_circle_creator.hpp:65
int index_type
Definition: piecewise_circle_creator.hpp:248
point_type get_origin() const
Definition: piecewise_circle_creator.hpp:86
Definition: piecewise.hpp:244
Eigen::Matrix< data_type, 1, dim__ > point_type
Definition: piecewise_creator_base.hpp:34
int index_type
Definition: piecewise_circle_creator.hpp:439
tol__ tolerance_type
Definition: piecewise_circle_creator.hpp:441
Definition: piecewise_circle_creator.hpp:244
index_type get_number_segments() const
Definition: piecewise_creator_base.hpp:47
void set(const point_type &start, const point_type &orig, const point_type &normal)
Definition: piecewise_circle_creator.hpp:328
void set_3pt(const point_type &start, const point_type &middle, const point_type &end)
Definition: piecewise_circle_creator.hpp:367
piecewise_circle_creator()
Definition: piecewise_circle_creator.hpp:253
void set_y_radius(const data_type &yr)
Definition: piecewise_circle_creator.hpp:225
data_type get_y_axis_radius() const
Definition: piecewise_circle_creator.hpp:488
Definition: piecewise_circle_creator.hpp:60
piecewise_ellipse_creator(const index_type &ns)
Definition: piecewise_circle_creator.hpp:445
piecewise_circle_creator(const index_type &ns)
Definition: piecewise_circle_creator.hpp:254
data_type get_segment_dt(const index_type &i) const
Definition: piecewise_creator_base.hpp:78
void clear()
Definition: piecewise.hpp:599
Eigen::Matrix< data_type, 1, dim__ > point_type
Definition: piecewise_circle_creator.hpp:249
virtual bool create(piecewise< bezier, data_type, dim__, tolerance_type > &pc) const
Definition: piecewise_circle_creator.hpp:110
data_type get_x_axis_radius() const
Definition: piecewise_circle_creator.hpp:466
Eigen::Matrix< data_type, 1, dim__ > point_type
Definition: piecewise_circle_creator.hpp:440
void set_y_axis_radius(const data_type &yr)
Definition: piecewise_circle_creator.hpp:471
tol__ tolerance_type
Definition: piecewise_creator_base.hpp:36
void get_xy_directions(point_type &xdir, point_type &ydir) const
Definition: piecewise_circle_creator.hpp:104
piecewise_ellipse_creator_base(const index_type &ns, const data_type &xr, const data_type &yr)
Definition: piecewise_circle_creator.hpp:75
piecewise_ellipse_creator_base(const piecewise_ellipse_creator_base< data_type, dim__, tolerance_type > &pcc)
Definition: piecewise_circle_creator.hpp:81
void calculate_circle(data__ &rad, data__ &x0, data__ &y0, const data__ &xa, const data__ &ya, const data__ &xb, const data__ &yb, const data__ &xc, const data__ &yc)
Definition: piecewise_circle_creator.hpp:37
point_type x
Definition: piecewise_circle_creator.hpp:239
base_class_type::index_type index_type
Definition: piecewise_circle_creator.hpp:66
void set_t0(const data_type &t0_in)
Definition: piecewise.hpp:340
data_type get_t0() const
Definition: piecewise_creator_base.hpp:62
void set(const point_type &orig, const point_type &x, const point_type &y, const data_type &xr, const data_type &yr)
Definition: piecewise_circle_creator.hpp:493
point_type::Index index_type
Definition: piecewise_creator_base.hpp:35
point_type origin
Definition: piecewise_circle_creator.hpp:239
data_type xradius
Definition: piecewise_circle_creator.hpp:240
void set(const point_type &orig, const point_type &x, const point_type &y, const data_type &r)
Definition: piecewise_circle_creator.hpp:283
void set_xy_directions(const point_type &xdir, const point_type &ydir)
Definition: piecewise_circle_creator.hpp:88
Definition: piecewise_creator_base.hpp:30
void set_radius(const data_type &r)
Definition: piecewise_circle_creator.hpp:258
data_type get_radius() const
Definition: piecewise_circle_creator.hpp:277
void set(const point_type &start, const point_type &orig)
Definition: piecewise_circle_creator.hpp:290