Sketcher: solver: implement Value for all other curves
for line, circle, and ellipse. Compiles, but untested.
This commit is contained in:
parent
9b71ebf48b
commit
2d0ad5ac11
|
@ -105,6 +105,15 @@ DeriVector2 Line::CalculateNormal(Point &p, double* derivparam)
|
||||||
return p2v.subtr(p1v).rotate90ccw();
|
return p2v.subtr(p1v).rotate90ccw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DeriVector2 Line::Value(double u, double du, double* derivparam)
|
||||||
|
{
|
||||||
|
DeriVector2 p1v(p1, derivparam);
|
||||||
|
DeriVector2 p2v(p2, derivparam);
|
||||||
|
|
||||||
|
DeriVector2 line_vec = p2v.subtr(p1v);
|
||||||
|
return p1v.sum(line_vec.multD(u,du));
|
||||||
|
}
|
||||||
|
|
||||||
int Line::PushOwnParams(VEC_pD &pvec)
|
int Line::PushOwnParams(VEC_pD &pvec)
|
||||||
{
|
{
|
||||||
int cnt=0;
|
int cnt=0;
|
||||||
|
@ -138,6 +147,21 @@ DeriVector2 Circle::CalculateNormal(Point &p, double* derivparam)
|
||||||
return cv.subtr(pv);
|
return cv.subtr(pv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DeriVector2 Circle::Value(double u, double du, double* derivparam)
|
||||||
|
{
|
||||||
|
//(x,y) = center + cos(u)*(r,0) + sin(u)*(0,r)
|
||||||
|
|
||||||
|
DeriVector2 cv (center, derivparam);
|
||||||
|
double r, dr;
|
||||||
|
r = *(this->rad); dr = (derivparam == this->rad) ? 1.0 : 0.0;
|
||||||
|
DeriVector2 ex (r,0.0,dr,0.0);
|
||||||
|
DeriVector2 ey = ex.rotate90ccw();
|
||||||
|
double si, dsi, co, dco;
|
||||||
|
si = std::sin(u); dsi = du*std::cos(u);
|
||||||
|
co = std::cos(u); dco = du*(-std::sin(u));
|
||||||
|
return cv.sum(ex.multD(co,dco).sum(ey.multD(si,dsi)));
|
||||||
|
}
|
||||||
|
|
||||||
int Circle::PushOwnParams(VEC_pD &pvec)
|
int Circle::PushOwnParams(VEC_pD &pvec)
|
||||||
{
|
{
|
||||||
int cnt=0;
|
int cnt=0;
|
||||||
|
@ -256,6 +280,39 @@ DeriVector2 Ellipse::CalculateNormal(Point &p, double* derivparam)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DeriVector2 Ellipse::Value(double u, double du, double* derivparam)
|
||||||
|
{
|
||||||
|
//In local coordinate system, value() of ellipse is:
|
||||||
|
//(a*cos(u), b*sin(u))
|
||||||
|
//In global, it is (vector formula):
|
||||||
|
//center + a_vec*cos(u) + b_vec*sin(u).
|
||||||
|
//That's what is being computed here.
|
||||||
|
|
||||||
|
// <construct a_vec, b_vec>
|
||||||
|
DeriVector2 c(this->center, derivparam);
|
||||||
|
DeriVector2 f1(this->focus1, derivparam);
|
||||||
|
|
||||||
|
DeriVector2 emaj = f1.subtr(c).getNormalized();
|
||||||
|
DeriVector2 emin = emaj.rotate90ccw();
|
||||||
|
double b, db;
|
||||||
|
b = *(this->radmin); db = this->radmin==derivparam ? 1.0 : 0.0;
|
||||||
|
double a, da;
|
||||||
|
a = this->getRadMaj(c,f1,b,db,da);
|
||||||
|
DeriVector2 a_vec = emaj.multD(a,da);
|
||||||
|
DeriVector2 b_vec = emin.multD(b,db);
|
||||||
|
// </construct a_vec, b_vec>
|
||||||
|
|
||||||
|
// sin, cos with derivatives:
|
||||||
|
double co, dco, si, dsi;
|
||||||
|
co = std::cos(u); dco = -std::sin(u)*du;
|
||||||
|
si = std::sin(u); dsi = std::cos(u)*du;
|
||||||
|
|
||||||
|
DeriVector2 ret; //point of ellipse at parameter value of u, in global coordinates
|
||||||
|
ret = a_vec.multD(co,dco).sum(b_vec.multD(si,dsi)).sum(c);
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int Ellipse::PushOwnParams(VEC_pD &pvec)
|
int Ellipse::PushOwnParams(VEC_pD &pvec)
|
||||||
{
|
{
|
||||||
int cnt=0;
|
int cnt=0;
|
||||||
|
|
|
@ -124,6 +124,7 @@ namespace GCS
|
||||||
Point p1;
|
Point p1;
|
||||||
Point p2;
|
Point p2;
|
||||||
DeriVector2 CalculateNormal(Point &p, double* derivparam = 0);
|
DeriVector2 CalculateNormal(Point &p, double* derivparam = 0);
|
||||||
|
DeriVector2 Value(double u, double du, double* derivparam = 0);
|
||||||
virtual int PushOwnParams(VEC_pD &pvec);
|
virtual int PushOwnParams(VEC_pD &pvec);
|
||||||
virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt);
|
virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt);
|
||||||
virtual Line* Copy();
|
virtual Line* Copy();
|
||||||
|
@ -137,6 +138,7 @@ namespace GCS
|
||||||
Point center;
|
Point center;
|
||||||
double *rad;
|
double *rad;
|
||||||
DeriVector2 CalculateNormal(Point &p, double* derivparam = 0);
|
DeriVector2 CalculateNormal(Point &p, double* derivparam = 0);
|
||||||
|
DeriVector2 Value(double u, double du, double* derivparam = 0);
|
||||||
virtual int PushOwnParams(VEC_pD &pvec);
|
virtual int PushOwnParams(VEC_pD &pvec);
|
||||||
virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt);
|
virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt);
|
||||||
virtual Circle* Copy();
|
virtual Circle* Copy();
|
||||||
|
@ -180,6 +182,7 @@ namespace GCS
|
||||||
virtual double getRadMaj(double* derivparam, double &ret_dRadMaj);
|
virtual double getRadMaj(double* derivparam, double &ret_dRadMaj);
|
||||||
virtual double getRadMaj();
|
virtual double getRadMaj();
|
||||||
DeriVector2 CalculateNormal(Point &p, double* derivparam = 0);
|
DeriVector2 CalculateNormal(Point &p, double* derivparam = 0);
|
||||||
|
DeriVector2 Value(double u, double du, double* derivparam = 0);
|
||||||
virtual int PushOwnParams(VEC_pD &pvec);
|
virtual int PushOwnParams(VEC_pD &pvec);
|
||||||
virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt);
|
virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt);
|
||||||
virtual Ellipse* Copy();
|
virtual Ellipse* Copy();
|
||||||
|
|
Loading…
Reference in New Issue
Block a user