Sketcher: Freegcs Parabola geometry definition
This commit is contained in:
parent
1ec381a07f
commit
e360dc15ef
|
@ -504,4 +504,107 @@ ArcOfHyperbola* ArcOfHyperbola::Copy()
|
||||||
return crv;
|
return crv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------parabola
|
||||||
|
|
||||||
|
DeriVector2 Parabola::CalculateNormal(Point &p, double* derivparam)
|
||||||
|
{
|
||||||
|
//fill some vectors in
|
||||||
|
DeriVector2 cv (vertex, derivparam);
|
||||||
|
DeriVector2 f1v (focus1, derivparam);
|
||||||
|
DeriVector2 pv (p, derivparam);
|
||||||
|
|
||||||
|
// the normal is the vector from the focus to the intersection of ano thru the point p and direction
|
||||||
|
// of the symetry axis of the parabola with the directrix.
|
||||||
|
// As both point to directrix and point to focus are of equal magnitude, we can work with unitary vectors
|
||||||
|
// to calculate the normal, substraction of those vectors.
|
||||||
|
|
||||||
|
DeriVector2 ret = cv.subtr(f1v).getNormalized().subtr(f1v.subtr(pv).getNormalized());
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
DeriVector2 Parabola::Value(double u, double du, double* derivparam)
|
||||||
|
{
|
||||||
|
|
||||||
|
//In local coordinate system, value() of parabola is:
|
||||||
|
//P(U) = O + U*U/(4.*F)*XDir + U*YDir
|
||||||
|
|
||||||
|
DeriVector2 c(this->vertex, derivparam);
|
||||||
|
DeriVector2 f1(this->focus1, derivparam);
|
||||||
|
|
||||||
|
DeriVector2 fv = f1.subtr(c);
|
||||||
|
|
||||||
|
double f,df;
|
||||||
|
|
||||||
|
f = fv.length(df);
|
||||||
|
|
||||||
|
DeriVector2 xdir = fv.getNormalized();
|
||||||
|
DeriVector2 ydir = xdir.rotate90ccw();
|
||||||
|
|
||||||
|
DeriVector2 dirx = xdir.multD(u,du).multD(u,du).multD(0.25*f,0.5*df);
|
||||||
|
DeriVector2 diry = ydir.multD(u,du);
|
||||||
|
|
||||||
|
DeriVector2 dir = dirx.sum(diry);
|
||||||
|
|
||||||
|
DeriVector2 ret; //point of parabola at parameter value of u, in global coordinates
|
||||||
|
|
||||||
|
ret = c.sum( dir );
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int Parabola::PushOwnParams(VEC_pD &pvec)
|
||||||
|
{
|
||||||
|
int cnt=0;
|
||||||
|
pvec.push_back(vertex.x); cnt++;
|
||||||
|
pvec.push_back(vertex.y); cnt++;
|
||||||
|
pvec.push_back(focus1.x); cnt++;
|
||||||
|
pvec.push_back(focus1.y); cnt++;
|
||||||
|
return cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Parabola::ReconstructOnNewPvec(VEC_pD &pvec, int &cnt)
|
||||||
|
{
|
||||||
|
vertex.x=pvec[cnt]; cnt++;
|
||||||
|
vertex.y=pvec[cnt]; cnt++;
|
||||||
|
focus1.x=pvec[cnt]; cnt++;
|
||||||
|
focus1.y=pvec[cnt]; cnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
Parabola* Parabola::Copy()
|
||||||
|
{
|
||||||
|
Parabola* crv = new Parabola(*this);
|
||||||
|
return crv;
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------- arc of hyperbola
|
||||||
|
int ArcOfParabola::PushOwnParams(VEC_pD &pvec)
|
||||||
|
{
|
||||||
|
int cnt=0;
|
||||||
|
cnt += Parabola::PushOwnParams(pvec);
|
||||||
|
pvec.push_back(start.x); cnt++;
|
||||||
|
pvec.push_back(start.y); cnt++;
|
||||||
|
pvec.push_back(end.x); cnt++;
|
||||||
|
pvec.push_back(end.y); cnt++;
|
||||||
|
pvec.push_back(startAngle); cnt++;
|
||||||
|
pvec.push_back(endAngle); cnt++;
|
||||||
|
return cnt;
|
||||||
|
|
||||||
|
}
|
||||||
|
void ArcOfParabola::ReconstructOnNewPvec(VEC_pD &pvec, int &cnt)
|
||||||
|
{
|
||||||
|
Parabola::ReconstructOnNewPvec(pvec,cnt);
|
||||||
|
start.x=pvec[cnt]; cnt++;
|
||||||
|
start.y=pvec[cnt]; cnt++;
|
||||||
|
end.x=pvec[cnt]; cnt++;
|
||||||
|
end.y=pvec[cnt]; cnt++;
|
||||||
|
startAngle=pvec[cnt]; cnt++;
|
||||||
|
endAngle=pvec[cnt]; cnt++;
|
||||||
|
}
|
||||||
|
ArcOfParabola* ArcOfParabola::Copy()
|
||||||
|
{
|
||||||
|
ArcOfParabola* crv = new ArcOfParabola(*this);
|
||||||
|
return crv;
|
||||||
|
}
|
||||||
|
|
||||||
}//namespace GCS
|
}//namespace GCS
|
||||||
|
|
|
@ -240,6 +240,36 @@ namespace GCS
|
||||||
virtual ArcOfHyperbola* Copy();
|
virtual ArcOfHyperbola* Copy();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Parabola: public Curve
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Parabola(){ }
|
||||||
|
virtual ~Parabola(){}
|
||||||
|
Point vertex;
|
||||||
|
Point focus1;
|
||||||
|
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 Parabola* Copy();
|
||||||
|
};
|
||||||
|
|
||||||
|
class ArcOfParabola: public Parabola
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ArcOfParabola(){startAngle=0;endAngle=0;}
|
||||||
|
virtual ~ArcOfParabola(){}
|
||||||
|
// parameters
|
||||||
|
double *startAngle;
|
||||||
|
double *endAngle;
|
||||||
|
Point start;
|
||||||
|
Point end;
|
||||||
|
// interface helpers
|
||||||
|
virtual int PushOwnParams(VEC_pD &pvec);
|
||||||
|
virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt);
|
||||||
|
virtual ArcOfParabola* Copy();
|
||||||
|
};
|
||||||
|
|
||||||
} //namespace GCS
|
} //namespace GCS
|
||||||
|
|
||||||
#endif // PLANEGCS_GEO_H
|
#endif // PLANEGCS_GEO_H
|
||||||
|
|
Loading…
Reference in New Issue
Block a user