From 2d0ad5ac1181c28f41e1bff1c5e9f7fd5f45c77e Mon Sep 17 00:00:00 2001 From: DeepSOIC Date: Wed, 13 Jan 2016 20:44:09 +0300 Subject: [PATCH] Sketcher: solver: implement Value for all other curves for line, circle, and ellipse. Compiles, but untested. --- src/Mod/Sketcher/App/planegcs/Geo.cpp | 57 +++++++++++++++++++++++++++ src/Mod/Sketcher/App/planegcs/Geo.h | 3 ++ 2 files changed, 60 insertions(+) diff --git a/src/Mod/Sketcher/App/planegcs/Geo.cpp b/src/Mod/Sketcher/App/planegcs/Geo.cpp index a42bacc99..21fd0efd4 100644 --- a/src/Mod/Sketcher/App/planegcs/Geo.cpp +++ b/src/Mod/Sketcher/App/planegcs/Geo.cpp @@ -105,6 +105,15 @@ DeriVector2 Line::CalculateNormal(Point &p, double* derivparam) 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 cnt=0; @@ -138,6 +147,21 @@ DeriVector2 Circle::CalculateNormal(Point &p, double* derivparam) 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 cnt=0; @@ -253,7 +277,40 @@ DeriVector2 Ellipse::CalculateNormal(Point &p, double* derivparam) } #endif + 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. + + // + 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); + // + + // 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) diff --git a/src/Mod/Sketcher/App/planegcs/Geo.h b/src/Mod/Sketcher/App/planegcs/Geo.h index 69bbf6853..04e871447 100644 --- a/src/Mod/Sketcher/App/planegcs/Geo.h +++ b/src/Mod/Sketcher/App/planegcs/Geo.h @@ -124,6 +124,7 @@ namespace GCS Point p1; Point p2; DeriVector2 CalculateNormal(Point &p, double* derivparam = 0); + DeriVector2 Value(double u, double du, double* derivparam = 0); virtual int PushOwnParams(VEC_pD &pvec); virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt); virtual Line* Copy(); @@ -137,6 +138,7 @@ namespace GCS Point center; double *rad; DeriVector2 CalculateNormal(Point &p, double* derivparam = 0); + DeriVector2 Value(double u, double du, double* derivparam = 0); virtual int PushOwnParams(VEC_pD &pvec); virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt); virtual Circle* Copy(); @@ -180,6 +182,7 @@ namespace GCS virtual double getRadMaj(double* derivparam, double &ret_dRadMaj); virtual double getRadMaj(); DeriVector2 CalculateNormal(Point &p, double* derivparam = 0); + DeriVector2 Value(double u, double du, double* derivparam = 0); virtual int PushOwnParams(VEC_pD &pvec); virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt); virtual Ellipse* Copy();