Hyperbola solver equality constraint

The Ellipse radii solver constraint was reused generalised to MajorAxisConic class.

UI representation of the Equality sign not yet handled (appears on the origin).
This commit is contained in:
Abdullah Tahiri 2016-01-12 17:01:32 +01:00 committed by wmayer
parent 8de37eb193
commit 5556228d07
6 changed files with 62 additions and 30 deletions

View File

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

View File

@ -1247,56 +1247,56 @@ double ConstraintInternalAlignmentPoint2Ellipse::grad(double *param)
}
// ConstraintEqualMajorAxesEllipse
ConstraintEqualMajorAxesEllipse:: ConstraintEqualMajorAxesEllipse(Ellipse &e1, Ellipse &e2)
ConstraintEqualMajorAxesConic:: ConstraintEqualMajorAxesConic(MajorRadiusConic * a1, MajorRadiusConic * a2)
{
this->e1 = e1;
this->e1.PushOwnParams(pvec);
this->e2 = e2;
this->e2.PushOwnParams(pvec);
this->e1 = a1;
this->e1->PushOwnParams(pvec);
this->e2 = a2;
this->e2->PushOwnParams(pvec);
origpvec = pvec;
pvecChangedFlag = true;
rescale();
}
void ConstraintEqualMajorAxesEllipse::ReconstructGeomPointers()
void ConstraintEqualMajorAxesConic::ReconstructGeomPointers()
{
int i =0;
e1.ReconstructOnNewPvec(pvec, i);
e2.ReconstructOnNewPvec(pvec, i);
e1->ReconstructOnNewPvec(pvec, i);
e2->ReconstructOnNewPvec(pvec, i);
pvecChangedFlag = false;
}
ConstraintType ConstraintEqualMajorAxesEllipse::getTypeId()
ConstraintType ConstraintEqualMajorAxesConic::getTypeId()
{
return EqualMajorAxesEllipse;
return EqualMajorAxesConic;
}
void ConstraintEqualMajorAxesEllipse::rescale(double coef)
void ConstraintEqualMajorAxesConic::rescale(double coef)
{
scale = coef * 1;
}
void ConstraintEqualMajorAxesEllipse::errorgrad(double *err, double *grad, double *param)
void ConstraintEqualMajorAxesConic::errorgrad(double *err, double *grad, double *param)
{
if (pvecChangedFlag) ReconstructGeomPointers();
double a1, da1;
a1 = e1.getRadMaj(param, da1);
a1 = e1->getRadMaj(param, da1);
double a2, da2;
a2 = e2.getRadMaj(param, da2);
a2 = e2->getRadMaj(param, da2);
if (err)
*err = a2 - a1;
if (grad)
*grad = da2 - da1;
}
double ConstraintEqualMajorAxesEllipse::error()
double ConstraintEqualMajorAxesConic::error()
{
double err;
errorgrad(&err,0,0);
return scale * err;
}
double ConstraintEqualMajorAxesEllipse::grad(double *param)
double ConstraintEqualMajorAxesConic::grad(double *param)
{
//first of all, check that we need to compute anything.
if ( findParamInPvec(param) == -1 ) return 0.0;

View File

@ -25,6 +25,7 @@
#include "Geo.h"
#include "Util.h"
#include <boost/graph/graph_concepts.hpp>
//#define _GCS_EXTRACT_SOLVER_SUBSYSTEM_ // This enables debuging code intended to extract information to file bug reports against Eigen, not for production code
@ -58,7 +59,7 @@ namespace GCS
PointOnEllipse = 13,
TangentEllipseLine = 14,
InternalAlignmentPoint2Ellipse = 15,
EqualMajorAxesEllipse = 16,
EqualMajorAxesConic = 16,
EllipticalArcRangeToEndPoints = 17,
AngleViaPoint = 18,
Snell = 19,
@ -422,14 +423,15 @@ namespace GCS
InternalAlignmentType AlignmentType;
};
class ConstraintEqualMajorAxesEllipse : public Constraint
class ConstraintEqualMajorAxesConic : public Constraint
{
private:
Ellipse e1, e2;
MajorRadiusConic * e1;
MajorRadiusConic * 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:
ConstraintEqualMajorAxesEllipse(Ellipse &e1, Ellipse &e2);
ConstraintEqualMajorAxesConic(MajorRadiusConic * a1, MajorRadiusConic * a2);
virtual ConstraintType getTypeId();
virtual void rescale(double coef=1.);
virtual double error();

View File

@ -751,14 +751,22 @@ int System::addConstraintEqualRadius(Circle &c1, Circle &c2, int tagId)
int System::addConstraintEqualRadii(Ellipse &e1, Ellipse &e2, int tagId)
{
//addConstraintEqual(e1.radmaj, e2.radmaj, tagId);
addConstraintEqual(e1.radmin, e2.radmin, tagId);
Constraint *constr = new ConstraintEqualMajorAxesEllipse(e1,e2);
Constraint *constr = new ConstraintEqualMajorAxesConic(&e1,&e2);
constr->setTag(tagId);
return addConstraint(constr);
}
int System::addConstraintEqualRadii(ArcOfHyperbola &a1, ArcOfHyperbola &a2, int tagId)
{
addConstraintEqual(a1.radmin, a2.radmin, tagId);
Constraint *constr = new ConstraintEqualMajorAxesConic(&a1,&a2);
constr->setTag(tagId);
return addConstraint(constr);
}
int System::addConstraintEqualRadius(Circle &c1, Arc &a2, int tagId)
{
return addConstraintEqual(c1.rad, a2.rad, tagId);

View File

@ -25,6 +25,7 @@
#include "SubSystem.h"
#include <boost/concept_check.hpp>
#include <boost/graph/graph_concepts.hpp>
namespace GCS
{
@ -208,6 +209,7 @@ namespace GCS
int addConstraintEqualLength(Line &l1, Line &l2, double *length, int tagId=0);
int addConstraintEqualRadius(Circle &c1, Circle &c2, int tagId=0);
int addConstraintEqualRadii(Ellipse &e1, Ellipse &e2, int tagId=0);
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 addConstraintP2PSymmetric(Point &p1, Point &p2, Line &l, int tagId=0);

View File

@ -149,7 +149,17 @@ namespace GCS
virtual Arc* Copy();
};
class Ellipse: public Curve
class MajorRadiusConic: public Curve
{
public:
virtual ~MajorRadiusConic(){}
virtual double getRadMaj(const DeriVector2 &center, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj) = 0;
virtual double getRadMaj(double* derivparam, double &ret_dRadMaj) = 0;
virtual double getRadMaj() = 0;
DeriVector2 CalculateNormal(Point &p, double* derivparam = 0) = 0;
};
class Ellipse: public MajorRadiusConic
{
public:
Ellipse(){ radmin = 0;}
@ -157,9 +167,9 @@ namespace GCS
Point center;
Point focus1;
double *radmin;
double getRadMaj(const DeriVector2 &center, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj);
double getRadMaj(double* derivparam, double &ret_dRadMaj);
double getRadMaj();
virtual double getRadMaj(const DeriVector2 &center, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj);
virtual double getRadMaj(double* derivparam, double &ret_dRadMaj);
virtual double getRadMaj();
DeriVector2 CalculateNormal(Point &p, double* derivparam = 0);
virtual int PushOwnParams(VEC_pD &pvec);
virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt);
@ -184,7 +194,7 @@ namespace GCS
virtual ArcOfEllipse* Copy();
};
class Hyperbola: public Curve
class Hyperbola: public MajorRadiusConic
{
public:
Hyperbola(){ radmin = 0;}
@ -192,9 +202,9 @@ namespace GCS
Point center;
Point focus1;
double *radmin;
double getRadMaj(const DeriVector2 &center, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj);
double getRadMaj(double* derivparam, double &ret_dRadMaj);
double getRadMaj();
virtual double getRadMaj(const DeriVector2 &center, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj);
virtual double getRadMaj(double* derivparam, double &ret_dRadMaj);
virtual double getRadMaj();
DeriVector2 CalculateNormal(Point &p, double* derivparam = 0);
virtual int PushOwnParams(VEC_pD &pvec);
virtual void ReconstructOnNewPvec (VEC_pD &pvec, int &cnt);