diff --git a/src/Mod/Sketcher/App/planegcs/Geo.cpp b/src/Mod/Sketcher/App/planegcs/Geo.cpp index 2f7c765bca4b..d63f6beb9a30 100644 --- a/src/Mod/Sketcher/App/planegcs/Geo.cpp +++ b/src/Mod/Sketcher/App/planegcs/Geo.cpp @@ -23,10 +23,12 @@ #define DEBUG_DERIVS 0 #if DEBUG_DERIVS -#include #endif #include "Geo.h" + +#include + namespace GCS{ DeriVector2::DeriVector2(const Point &p, double *derivparam) @@ -87,7 +89,15 @@ DeriVector2 DeriVector2::divD(double val, double dval) const ); } -DeriVector2 Line::CalculateNormal(Point & /*p*/, double* derivparam) +DeriVector2 Curve::Value(double u, double du, double* derivparam) +{ + assert(false /*Value() is not implemented*/); + return DeriVector2(); +} + +//----------------Line + +DeriVector2 Line::CalculateNormal(Point &p, double* derivparam) { DeriVector2 p1v(p1, derivparam); DeriVector2 p2v(p2, derivparam); @@ -348,6 +358,39 @@ DeriVector2 Hyperbola::CalculateNormal(Point &p, double* derivparam) return ret; } +DeriVector2 Hyperbola::Value(double u, double du, double* derivparam) +{ + + //In local coordinate system, value() of hyperbola is: + //(a*cosh(u), b*sinh(u)) + //In global, it is (vector formula): + //center + a_vec*cosh(u) + b_vec*sinh(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); + // + + // sinh, cosh with derivatives: + double co, dco, si, dsi; + co = std::cosh(u); dco = std::sinh(u)*du; + si = std::sinh(u); dsi = std::cosh(u)*du; + + DeriVector2 ret; //point of hyperbola 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 Hyperbola::PushOwnParams(VEC_pD &pvec) { int cnt=0; diff --git a/src/Mod/Sketcher/App/planegcs/Geo.h b/src/Mod/Sketcher/App/planegcs/Geo.h index 9a020ef4a248..69bbf6853a26 100644 --- a/src/Mod/Sketcher/App/planegcs/Geo.h +++ b/src/Mod/Sketcher/App/planegcs/Geo.h @@ -99,6 +99,15 @@ namespace GCS // fields of DeriVector2. virtual DeriVector2 CalculateNormal(Point &p, double* derivparam = 0) = 0; + /** + * @brief Value: returns point (vector) given the value of parameter + * @param u: value of parameter + * @param du: derivative of parameter by derivparam + * @param derivparam: pointer to sketch parameter to calculate the derivative for + * @return + */ + virtual DeriVector2 Value(double u, double du, double* derivparam = 0); + //adds curve's parameters to pvec (used by constraints) virtual int PushOwnParams(VEC_pD &pvec) = 0; //recunstruct curve's parameters reading them from pvec starting from index cnt. @@ -206,6 +215,7 @@ namespace GCS virtual double getRadMaj(double* derivparam, double &ret_dRadMaj); virtual double getRadMaj(); DeriVector2 CalculateNormal(Point &p, double* derivparam = 0); + virtual DeriVector2 Value(double u, double du, double* derivparam = 0); virtual int PushOwnParams(VEC_pD &pvec); virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt); virtual Hyperbola* Copy();