17 #include "a_segment.h"
40 for (
int i = 0; i < ifn.
size(); i++)
75 xi = (*this)(a-
da_+1.);
77 return (.5*(xs-xi)/
da_);
91 xs = (*this)(a+
da_-1.);
92 return (.5*(xs-xi)/
da_);
105 return (.5*(xs-xi)/
da_);
111 a_point * p0 = (*this)[0];
112 a_point * pn = (*this)[this->
size()-1];
113 return ((*p0)==(*pn));
123 return ((xs-xi)/
da_);
129 return ((xs-xi)/
da_);
135 return (.5*(xs-xi)/
da_);
148 a_point pd = p-*
x_[0];
161 int n_pts =
x_.size();
162 for (
int i = 0; i < n_pts; i++)
181 int n_pts =
x_.size();
182 for (
int i = 0; i < n_pts; i++)
197 for (
int i = 0; i <
n_pts_; i++)
210 for (
int i = 0; i <
n_pts_; i++)
212 a_point x1 = *
x_[i]-x0;
221 for (
int i = 0; i <
n_pts_; i++)
253 for (
int i = 0; i <
n_pts_-1; i++)
255 a_point
pt = *
x_[i+1]-*
x_[i];
259 a_point
pt = *
x_[0]-**(
x_.end()-1);
271 for (
int i = 0; i <
n_pts_-1; i++)
273 a_point
pt = *
x_[i+1]-*
x_[i];
277 a_point
pt = *
x_[0]-**(
x_.end()-1);
280 if (perp.norm()<1e-8)
286 std::cerr <<
"this case is not yet supported (see code a_curve)" << std::endl;
303 int n_pts =
x_.size();
304 for (
int i = 0; i < n_pts; i++)
306 double d = ((*
x_[i])-p).norm();
321 int n_pts =
x_.size();
322 for (
int i = 0; i < n_pts-1; i++)
324 a_segment s(*
x_[i],*
x_[i+1]);
325 a_point a = s.closest(p);
326 double d = (a-p).norm();
334 m = (a0-*
x_[ref]).norm()/(*
x_[ref+1]-*
x_[ref]).norm();
342 int n_pts =
x_.size();
343 for (
int i = 0; i < n_pts; i++)
345 double d = ((*
x_[i])-p).norm();
359 int n_pts = fn.
size();
360 for (
int i = 0; i < n_pts; i++)
363 double d = this->
dist(*fn[i],ref1t);
378 int n_pts = fn.
size();
379 for (
int i = 0; i < n_pts; i++)
382 double d = this->
dist_last(*fn[i],ref1t);
396 const double eps = 1e-10;
399 int n_pt2 = fn.
size();
400 for (
int i2 = 0; i2 < n_pt2-1; i2++)
402 a_segment seg2(*fn[i2],*fn[i2+1]);
403 if (seg2.length()<eps)
405 std::cerr <<
"error: |seg2(" << i2+1 <<
")| ~= 0" << std::endl;
408 int n_pt1 =
x_.size();
409 for (
int i1 = 0; i1 < n_pt1-1; i1++)
411 a_segment seg1(*
x_[i1],*
x_[i1+1]);
412 if (seg1.length()<eps)
414 std::cerr <<
"error: |seg1(" << i1+1 <<
")| ~= 0" << std::endl;
417 a_segment inter = seg1.shortest(seg2,mm1,mm2);
418 double d = inter.length();
429 std::cerr <<
"-----------------" << std::endl;
430 std::cerr << seg1 << std::endl;
431 std::cerr << seg2 << std::endl;
442 const double eps = 1e-10;
445 int n_pt2 = fn.
size();
446 for (
int i2 = 0; i2 < n_pt2-1; i2++)
448 a_segment seg2(*fn[i2],*fn[i2+1]);
449 if (seg2.length()<eps)
451 std::cerr <<
"error: |seg2(" << i2+1 <<
")| ~= 0" << std::endl;
454 int n_pt1 =
x_.size();
455 for (
int i1 = 0; i1 < n_pt1-1; i1++)
457 a_segment seg1(*
x_[i1],*
x_[i1+1]);
458 if (seg1.length()<eps)
460 std::cerr <<
"error: |seg1(" << i1+1 <<
")| ~= 0" << std::endl;
463 a_segment inter = seg1.shortest(seg2,mm1,mm2);
464 double d = inter.length();
483 for (
int i = 0; i < n_pts; i++)
487 auto p =
new a_point(x,y,z);
495 int n_pts = f.
x_.size();
496 o << n_pts << std::endl;
497 for (
int i = 0; i < n_pts; i++)
498 o << f.
x_[i] << std::endl;
const a_point horiz0(0, 1, 0)
std::ostream & operator<<(std::ostream &o, const a_curve &f)
std::istream & operator>>(std::istream &in, a_curve &f)
sampled parametric function class (interface)
a_curve & construct_y_axis()
double dist_last(const a_point &, int &ref) const
double dist2(const a_point &, int &ref, double &m) const
a_curve & construct_z_axis()
virtual a_point dx_axis(double a) const
std::deque< a_point * > & x()
virtual a_point dz_axis(double a) const
virtual a_point dy_axis(double a) const
double dist(const a_point &, int &ref) const
a_segment shortest(const a_curve &fn, int &ref1, int &ref2, double &m1, double &m2) const
a_curve & place3D(a_point &origin, a_point &x_axis, a_point &y_axis)
a_curve & construct_x_axis()
a_curve & construct_axis()
bool is_closed() const
!!!!!!
a_curve & translate(const a_point &p)
std::deque< a_point * > x_
e_point cross(e_point &a, e_point &b)