GCS: Full detection of dependent parameters with Dense Full Household pivoting QR decomposition
- Improve Debug information. - Support for addition of constraints with driving information for the solver constraints. - Removal of the driven constraints from the Jacobian for QR decomposition - Removal of the value freewheeling parameter from the Jacobian for QR decomposition - Full detection of dependent parameters where DoF are present for Dense QR.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -75,6 +75,7 @@ namespace GCS
|
||||
// about partitioning into subsystems and solution strategies
|
||||
private:
|
||||
VEC_pD plist; // list of the unknown parameters
|
||||
VEC_pD pdrivenlist; // list of parameters of driven constraints
|
||||
MAP_pD_I pIndex;
|
||||
|
||||
VEC_pD pdependentparameters; // list of dependent parameters by the system
|
||||
@@ -145,97 +146,97 @@ namespace GCS
|
||||
void removeConstraint(Constraint *constr);
|
||||
|
||||
// basic constraints
|
||||
int addConstraintEqual(double *param1, double *param2, int tagId=0);
|
||||
int addConstraintEqual(double *param1, double *param2, int tagId=0, bool driving = true);
|
||||
int addConstraintDifference(double *param1, double *param2,
|
||||
double *difference, int tagId=0);
|
||||
int addConstraintP2PDistance(Point &p1, Point &p2, double *distance, int tagId=0);
|
||||
double *difference, int tagId=0, bool driving = true);
|
||||
int addConstraintP2PDistance(Point &p1, Point &p2, double *distance, int tagId=0, bool driving = true);
|
||||
int addConstraintP2PAngle(Point &p1, Point &p2, double *angle,
|
||||
double incrAngle, int tagId=0);
|
||||
int addConstraintP2PAngle(Point &p1, Point &p2, double *angle, int tagId=0);
|
||||
int addConstraintP2LDistance(Point &p, Line &l, double *distance, int tagId=0);
|
||||
int addConstraintPointOnLine(Point &p, Line &l, int tagId=0);
|
||||
int addConstraintPointOnLine(Point &p, Point &lp1, Point &lp2, int tagId=0);
|
||||
int addConstraintPointOnPerpBisector(Point &p, Line &l, int tagId=0);
|
||||
int addConstraintPointOnPerpBisector(Point &p, Point &lp1, Point &lp2, int tagId=0);
|
||||
int addConstraintParallel(Line &l1, Line &l2, int tagId=0);
|
||||
int addConstraintPerpendicular(Line &l1, Line &l2, int tagId=0);
|
||||
double incrAngle, int tagId=0, bool driving = true);
|
||||
int addConstraintP2PAngle(Point &p1, Point &p2, double *angle, int tagId=0, bool driving = true);
|
||||
int addConstraintP2LDistance(Point &p, Line &l, double *distance, int tagId=0, bool driving = true);
|
||||
int addConstraintPointOnLine(Point &p, Line &l, int tagId=0, bool driving = true);
|
||||
int addConstraintPointOnLine(Point &p, Point &lp1, Point &lp2, int tagId=0, bool driving = true);
|
||||
int addConstraintPointOnPerpBisector(Point &p, Line &l, int tagId=0, bool driving = true);
|
||||
int addConstraintPointOnPerpBisector(Point &p, Point &lp1, Point &lp2, int tagId=0, bool driving = true);
|
||||
int addConstraintParallel(Line &l1, Line &l2, int tagId=0, bool driving = true);
|
||||
int addConstraintPerpendicular(Line &l1, Line &l2, int tagId=0, bool driving = true);
|
||||
int addConstraintPerpendicular(Point &l1p1, Point &l1p2,
|
||||
Point &l2p1, Point &l2p2, int tagId=0);
|
||||
int addConstraintL2LAngle(Line &l1, Line &l2, double *angle, int tagId=0);
|
||||
Point &l2p1, Point &l2p2, int tagId=0, bool driving = true);
|
||||
int addConstraintL2LAngle(Line &l1, Line &l2, double *angle, int tagId=0, bool driving = true);
|
||||
int addConstraintL2LAngle(Point &l1p1, Point &l1p2, Point &l2p1, Point &l2p2,
|
||||
double *angle, int tagId=0);
|
||||
double *angle, int tagId=0, bool driving = true);
|
||||
int addConstraintAngleViaPoint(Curve &crv1, Curve &crv2, Point &p,
|
||||
double *angle, int tagId=0);
|
||||
int addConstraintMidpointOnLine(Line &l1, Line &l2, int tagId=0);
|
||||
double *angle, int tagId=0, bool driving = true);
|
||||
int addConstraintMidpointOnLine(Line &l1, Line &l2, int tagId=0, bool driving = true);
|
||||
int addConstraintMidpointOnLine(Point &l1p1, Point &l1p2, Point &l2p1, Point &l2p2,
|
||||
int tagId=0);
|
||||
int tagId=0, bool driving = true);
|
||||
int addConstraintTangentCircumf(Point &p1, Point &p2, double *rd1, double *rd2,
|
||||
bool internal=false, int tagId=0);
|
||||
bool internal=false, int tagId=0, bool driving = true);
|
||||
|
||||
// derived constraints
|
||||
int addConstraintP2PCoincident(Point &p1, Point &p2, int tagId=0);
|
||||
int addConstraintHorizontal(Line &l, int tagId=0);
|
||||
int addConstraintHorizontal(Point &p1, Point &p2, int tagId=0);
|
||||
int addConstraintVertical(Line &l, int tagId=0);
|
||||
int addConstraintVertical(Point &p1, Point &p2, int tagId=0);
|
||||
int addConstraintCoordinateX(Point &p, double *x, int tagId=0);
|
||||
int addConstraintCoordinateY(Point &p, double *y, int tagId=0);
|
||||
int addConstraintArcRules(Arc &a, int tagId=0);
|
||||
int addConstraintPointOnCircle(Point &p, Circle &c, int tagId=0);
|
||||
int addConstraintPointOnEllipse(Point &p, Ellipse &e, int tagId=0);
|
||||
int addConstraintPointOnHyperbolicArc(Point &p, ArcOfHyperbola &e, int tagId=0);
|
||||
int addConstraintPointOnParabolicArc(Point &p, ArcOfParabola &e, int tagId=0);
|
||||
int addConstraintArcOfEllipseRules(ArcOfEllipse &a, int tagId=0);
|
||||
int addConstraintCurveValue(Point &p, Curve &a, double *u, int tagId=0);
|
||||
int addConstraintArcOfHyperbolaRules(ArcOfHyperbola &a, int tagId=0);
|
||||
int addConstraintArcOfParabolaRules(ArcOfParabola &a, int tagId=0);
|
||||
int addConstraintPointOnArc(Point &p, Arc &a, int tagId=0);
|
||||
int addConstraintP2PCoincident(Point &p1, Point &p2, int tagId=0, bool driving = true);
|
||||
int addConstraintHorizontal(Line &l, int tagId=0, bool driving = true);
|
||||
int addConstraintHorizontal(Point &p1, Point &p2, int tagId=0, bool driving = true);
|
||||
int addConstraintVertical(Line &l, int tagId=0, bool driving = true);
|
||||
int addConstraintVertical(Point &p1, Point &p2, int tagId=0, bool driving = true);
|
||||
int addConstraintCoordinateX(Point &p, double *x, int tagId=0, bool driving = true);
|
||||
int addConstraintCoordinateY(Point &p, double *y, int tagId=0, bool driving = true);
|
||||
int addConstraintArcRules(Arc &a, int tagId=0, bool driving = true);
|
||||
int addConstraintPointOnCircle(Point &p, Circle &c, int tagId=0, bool driving = true);
|
||||
int addConstraintPointOnEllipse(Point &p, Ellipse &e, int tagId=0, bool driving = true);
|
||||
int addConstraintPointOnHyperbolicArc(Point &p, ArcOfHyperbola &e, int tagId=0, bool driving = true);
|
||||
int addConstraintPointOnParabolicArc(Point &p, ArcOfParabola &e, int tagId=0, bool driving = true);
|
||||
int addConstraintArcOfEllipseRules(ArcOfEllipse &a, int tagId=0, bool driving = true);
|
||||
int addConstraintCurveValue(Point &p, Curve &a, double *u, int tagId=0, bool driving = true);
|
||||
int addConstraintArcOfHyperbolaRules(ArcOfHyperbola &a, int tagId=0, bool driving = true);
|
||||
int addConstraintArcOfParabolaRules(ArcOfParabola &a, int tagId=0, bool driving = true);
|
||||
int addConstraintPointOnArc(Point &p, Arc &a, int tagId=0, bool driving = true);
|
||||
int addConstraintPerpendicularLine2Arc(Point &p1, Point &p2, Arc &a,
|
||||
int tagId=0);
|
||||
int tagId=0, bool driving = true);
|
||||
int addConstraintPerpendicularArc2Line(Arc &a, Point &p1, Point &p2,
|
||||
int tagId=0);
|
||||
int tagId=0, bool driving = true);
|
||||
int addConstraintPerpendicularCircle2Arc(Point ¢er, double *radius, Arc &a,
|
||||
int tagId=0);
|
||||
int tagId=0, bool driving = true);
|
||||
int addConstraintPerpendicularArc2Circle(Arc &a, Point ¢er, double *radius,
|
||||
int tagId=0);
|
||||
int tagId=0, bool driving = true);
|
||||
int addConstraintPerpendicularArc2Arc(Arc &a1, bool reverse1,
|
||||
Arc &a2, bool reverse2, int tagId=0);
|
||||
int addConstraintTangent(Line &l, Circle &c, int tagId=0);
|
||||
int addConstraintTangent(Line &l, Ellipse &e, int tagId=0);
|
||||
int addConstraintTangent(Line &l, Arc &a, int tagId=0);
|
||||
int addConstraintTangent(Circle &c1, Circle &c2, int tagId=0);
|
||||
int addConstraintTangent(Arc &a1, Arc &a2, int tagId=0);
|
||||
int addConstraintTangent(Circle &c, Arc &a, int tagId=0);
|
||||
Arc &a2, bool reverse2, int tagId=0, bool driving = true);
|
||||
int addConstraintTangent(Line &l, Circle &c, int tagId=0, bool driving = true);
|
||||
int addConstraintTangent(Line &l, Ellipse &e, int tagId=0, bool driving = true);
|
||||
int addConstraintTangent(Line &l, Arc &a, int tagId=0, bool driving = true);
|
||||
int addConstraintTangent(Circle &c1, Circle &c2, int tagId=0, bool driving = true);
|
||||
int addConstraintTangent(Arc &a1, Arc &a2, int tagId=0, bool driving = true);
|
||||
int addConstraintTangent(Circle &c, Arc &a, int tagId=0, bool driving = true);
|
||||
|
||||
int addConstraintCircleRadius(Circle &c, double *radius, int tagId=0);
|
||||
int addConstraintArcRadius(Arc &a, double *radius, int tagId=0);
|
||||
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 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 addConstraintCircleRadius(Circle &c, double *radius, int tagId=0, bool driving = true);
|
||||
int addConstraintArcRadius(Arc &a, double *radius, int tagId=0, bool driving = true);
|
||||
int addConstraintEqualLength(Line &l1, Line &l2, double *length, int tagId=0, bool driving = true);
|
||||
int addConstraintEqualRadius(Circle &c1, Circle &c2, int tagId=0, bool driving = true);
|
||||
int addConstraintEqualRadii(Ellipse &e1, Ellipse &e2, int tagId=0, bool driving = true);
|
||||
int addConstraintEqualRadii(ArcOfHyperbola &a1, ArcOfHyperbola &a2, int tagId=0, bool driving = true);
|
||||
int addConstraintEqualRadius(Circle &c1, Arc &a2, int tagId=0, bool driving = true);
|
||||
int addConstraintEqualRadius(Arc &a1, Arc &a2, int tagId=0, bool driving = true);
|
||||
int addConstraintEqualFocus(ArcOfParabola &a1, ArcOfParabola &a2, int tagId=0, bool driving = true);
|
||||
int addConstraintP2PSymmetric(Point &p1, Point &p2, Line &l, int tagId=0, bool driving = true);
|
||||
int addConstraintP2PSymmetric(Point &p1, Point &p2, Point &p, int tagId=0, bool driving = true);
|
||||
int addConstraintSnellsLaw(Curve &ray1, Curve &ray2,
|
||||
Curve &boundary, Point p,
|
||||
double* n1, double* n2,
|
||||
bool flipn1, bool flipn2,
|
||||
int tagId);
|
||||
int tagId, bool driving = true);
|
||||
|
||||
// internal alignment constraints
|
||||
int addConstraintInternalAlignmentPoint2Ellipse(Ellipse &e, Point &p1, InternalAlignmentType alignmentType, int tagId=0);
|
||||
int addConstraintInternalAlignmentEllipseMajorDiameter(Ellipse &e, Point &p1, Point &p2, int tagId=0);
|
||||
int addConstraintInternalAlignmentEllipseMinorDiameter(Ellipse &e, Point &p1, Point &p2, int tagId=0);
|
||||
int addConstraintInternalAlignmentEllipseFocus1(Ellipse &e, Point &p1, int tagId=0);
|
||||
int addConstraintInternalAlignmentEllipseFocus2(Ellipse &e, Point &p1, int tagId=0);
|
||||
int addConstraintInternalAlignmentPoint2Hyperbola(Hyperbola &e, Point &p1, InternalAlignmentType alignmentType, int tagId=0);
|
||||
int addConstraintInternalAlignmentHyperbolaMajorDiameter(Hyperbola &e, Point &p1, Point &p2, int tagId=0);
|
||||
int addConstraintInternalAlignmentHyperbolaMinorDiameter(Hyperbola &e, Point &p1, Point &p2, int tagId=0);
|
||||
int addConstraintInternalAlignmentHyperbolaFocus(Hyperbola &e, Point &p1, int tagId=0);
|
||||
int addConstraintInternalAlignmentParabolaFocus(Parabola &e, Point &p1, int tagId=0);
|
||||
int addConstraintInternalAlignmentBSplineControlPoint(BSpline &b, Circle &c, int poleindex, int tag=0);
|
||||
int addConstraintInternalAlignmentPoint2Ellipse(Ellipse &e, Point &p1, InternalAlignmentType alignmentType, int tagId=0, bool driving = true);
|
||||
int addConstraintInternalAlignmentEllipseMajorDiameter(Ellipse &e, Point &p1, Point &p2, int tagId=0, bool driving = true);
|
||||
int addConstraintInternalAlignmentEllipseMinorDiameter(Ellipse &e, Point &p1, Point &p2, int tagId=0, bool driving = true);
|
||||
int addConstraintInternalAlignmentEllipseFocus1(Ellipse &e, Point &p1, int tagId=0, bool driving = true);
|
||||
int addConstraintInternalAlignmentEllipseFocus2(Ellipse &e, Point &p1, int tagId=0, bool driving = true);
|
||||
int addConstraintInternalAlignmentPoint2Hyperbola(Hyperbola &e, Point &p1, InternalAlignmentType alignmentType, int tagId=0, bool driving = true);
|
||||
int addConstraintInternalAlignmentHyperbolaMajorDiameter(Hyperbola &e, Point &p1, Point &p2, int tagId=0, bool driving = true);
|
||||
int addConstraintInternalAlignmentHyperbolaMinorDiameter(Hyperbola &e, Point &p1, Point &p2, int tagId=0, bool driving = true);
|
||||
int addConstraintInternalAlignmentHyperbolaFocus(Hyperbola &e, Point &p1, int tagId=0, bool driving = true);
|
||||
int addConstraintInternalAlignmentParabolaFocus(Parabola &e, Point &p1, int tagId=0, bool driving = true);
|
||||
int addConstraintInternalAlignmentBSplineControlPoint(BSpline &b, Circle &c, int poleindex, int tag=0, bool driving = true);
|
||||
|
||||
double calculateAngleViaPoint(Curve &crv1, Curve &crv2, Point &p);
|
||||
double calculateAngleViaPoint(Curve &crv1, Curve &crv2, Point &p1, Point &p2);
|
||||
@@ -251,6 +252,7 @@ namespace GCS
|
||||
void rescaleConstraint(int id, double coeff);
|
||||
|
||||
void declareUnknowns(VEC_pD ¶ms);
|
||||
void declareDrivenParams(VEC_pD ¶ms);
|
||||
void initSolution(Algorithm alg=DogLeg);
|
||||
|
||||
int solve(bool isFine=true, Algorithm alg=DogLeg, bool isRedundantsolving=false);
|
||||
|
||||
Reference in New Issue
Block a user