Sketcher: Parabola solver equality constraint

This commit is contained in:
Abdullah Tahiri 2016-12-24 02:39:02 +01:00
parent 0d93c45d70
commit 5c9cc6221b
5 changed files with 113 additions and 3 deletions

View File

@ -1825,6 +1825,16 @@ int Sketch::addEqualConstraint(int geoId1, int geoId2)
}
}
if (Geoms[geoId2].type == ArcOfParabola) {
if (Geoms[geoId1].type == ArcOfParabola) {
GCS::ArcOfParabola &a1 = ArcsOfParabola[Geoms[geoId1].index];
GCS::ArcOfParabola &a2 = ArcsOfParabola[Geoms[geoId2].index];
int tag = ++ConstraintsCounter;
GCSsys.addConstraintEqualFocus(a1, a2, tag);
return ConstraintsCounter;
}
}
if (Geoms[geoId1].type == Ellipse) {
GCS::Ellipse &e1 = Ellipses[Geoms[geoId1].index];
if (Geoms[geoId2].type == ArcOfEllipse) {

View File

@ -1423,6 +1423,82 @@ double ConstraintEqualMajorAxesConic::grad(double *param)
return deriv * scale;
}
// ConstraintEqualFocalDistance
ConstraintEqualFocalDistance:: ConstraintEqualFocalDistance(ArcOfParabola * a1, ArcOfParabola * a2)
{
this->e1 = a1;
this->e1->PushOwnParams(pvec);
this->e2 = a2;
this->e2->PushOwnParams(pvec);
origpvec = pvec;
pvecChangedFlag = true;
rescale();
}
void ConstraintEqualFocalDistance::ReconstructGeomPointers()
{
int i =0;
e1->ReconstructOnNewPvec(pvec, i);
e2->ReconstructOnNewPvec(pvec, i);
pvecChangedFlag = false;
}
ConstraintType ConstraintEqualFocalDistance::getTypeId()
{
return EqualFocalDistance;
}
void ConstraintEqualFocalDistance::rescale(double coef)
{
scale = coef * 1;
}
void ConstraintEqualFocalDistance::errorgrad(double *err, double *grad, double *param)
{
if (pvecChangedFlag) ReconstructGeomPointers();
DeriVector2 focus1(this->e1->focus1, param);
DeriVector2 vertex1(this->e1->vertex, param);
DeriVector2 focalvect1 = vertex1.subtr(focus1);
double focal1, dfocal1;
focal1 = focalvect1.length(dfocal1);
DeriVector2 focus2(this->e2->focus1, param);
DeriVector2 vertex2(this->e2->vertex, param);
DeriVector2 focalvect2 = vertex2.subtr(focus2);
double focal2, dfocal2;
focal2 = focalvect2.length(dfocal2);
if (err)
*err = focal2 - focal1;
if (grad)
*grad = dfocal2 - dfocal1;
}
double ConstraintEqualFocalDistance::error()
{
double err;
errorgrad(&err,0,0);
return scale * err;
}
double ConstraintEqualFocalDistance::grad(double *param)
{
//first of all, check that we need to compute anything.
if ( findParamInPvec(param) == -1 ) return 0.0;
double deriv;
errorgrad(0, &deriv, param);
return deriv * scale;
}
// ConstraintCurveValue
ConstraintCurveValue::ConstraintCurveValue(Point &p, double* pcoord, Curve& crv, double *u)
{

View File

@ -66,7 +66,8 @@ namespace GCS
CurveValue = 20,
PointOnHyperbola = 21,
InternalAlignmentPoint2Hyperbola = 22,
PointOnParabola = 23
PointOnParabola = 23,
EqualFocalDistance = 24
};
enum InternalAlignmentType {
@ -463,7 +464,22 @@ namespace GCS
virtual double error();
virtual double grad(double *);
};
class ConstraintEqualFocalDistance : public Constraint
{
private:
ArcOfParabola * e1;
ArcOfParabola * e2;
void ReconstructGeomPointers(); //writes pointers in pvec to the parameters of crv1, crv2 and poa
void errorgrad(double* err, double* grad, double *param); //error and gradient combined. Values are returned through pointers.
public:
ConstraintEqualFocalDistance(ArcOfParabola * a1, ArcOfParabola * a2);
virtual ConstraintType getTypeId();
virtual void rescale(double coef=1.);
virtual double error();
virtual double grad(double *);
};
class ConstraintCurveValue : public Constraint
{
private:

View File

@ -763,7 +763,14 @@ int System::addConstraintEqualRadii(ArcOfHyperbola &a1, ArcOfHyperbola &a2, int
Constraint *constr = new ConstraintEqualMajorAxesConic(&a1,&a2);
constr->setTag(tagId);
return addConstraint(constr);
return addConstraint(constr);
}
int System::addConstraintEqualFocus(ArcOfParabola &a1, ArcOfParabola &a2, int tagId)
{
Constraint *constr = new ConstraintEqualFocalDistance(&a1,&a2);
constr->setTag(tagId);
return addConstraint(constr);
}
int System::addConstraintEqualRadius(Circle &c1, Arc &a2, int tagId)

View File

@ -213,6 +213,7 @@ namespace GCS
int addConstraintEqualRadii(ArcOfHyperbola &a1, ArcOfHyperbola &a2, int tagId=0);
int addConstraintEqualRadius(Circle &c1, Arc &a2, int tagId=0);
int addConstraintEqualRadius(Arc &a1, Arc &a2, int tagId=0);
int addConstraintEqualFocus(ArcOfParabola &a1, ArcOfParabola &a2, int tagId=0);
int addConstraintP2PSymmetric(Point &p1, Point &p2, Line &l, int tagId=0);
int addConstraintP2PSymmetric(Point &p1, Point &p2, Point &p, int tagId=0);
int addConstraintSnellsLaw(Curve &ray1, Curve &ray2,