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:
parent
8de37eb193
commit
5556228d07
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 ¢er, 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 ¢er, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj);
|
||||
double getRadMaj(double* derivparam, double &ret_dRadMaj);
|
||||
double getRadMaj();
|
||||
virtual double getRadMaj(const DeriVector2 ¢er, 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 ¢er, const DeriVector2 &f1, double b, double db, double &ret_dRadMaj);
|
||||
double getRadMaj(double* derivparam, double &ret_dRadMaj);
|
||||
double getRadMaj();
|
||||
virtual double getRadMaj(const DeriVector2 ¢er, 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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user