From 0725e0be619f9c1aa2e2c016f4df850d71f46359 Mon Sep 17 00:00:00 2001 From: azv Date: Wed, 16 Sep 2015 10:37:12 +0300 Subject: [PATCH] Calculate points coordinates according their relation to the Angle center while changing angle value (issue #965) --- .../SketchPlugin_ConstraintAngle.cpp | 14 ++------------ .../SketchSolver_ConstraintAngle.cpp | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp b/src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp index 7874be395..c73ae7d17 100644 --- a/src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp +++ b/src/SketchPlugin/SketchPlugin_ConstraintAngle.cpp @@ -160,24 +160,14 @@ double SketchPlugin_ConstraintAngle::calculateAngle() }; // Directions of lines - if (aDist[0][1] < tolerance) + if (aDist[0][0] > aDist[0][1]) aEndA = aStartA; - if (aDist[1][1] < tolerance) + if (aDist[1][0] > aDist[1][1]) aEndB = aStartB; std::shared_ptr aDirA(new GeomAPI_Dir2d(aEndA->xy()->decreased(anInter->xy()))); std::shared_ptr aDirB(new GeomAPI_Dir2d(aEndB->xy()->decreased(anInter->xy()))); anAngle = fabs(aDirA->angle(aDirB)) * 180.0 / PI; - - // If the lines intersected inside one of them, the angle selected is less than 90 degrees - if ((aDist[0][0] >= tolerance && aDist[0][1] >= tolerance && - aDist[0][0] + aDist[0][1] < aStartA->distance(aEndA) + 2.0 * tolerance) || - (aDist[1][0] >= tolerance && aDist[1][1] >= tolerance && - aDist[1][0] + aDist[1][1] < aStartB->distance(aEndB) + 2.0 * tolerance)) { - if (anAngle > 90.0) - anAngle = 180.0 - anAngle; - } - return anAngle; } diff --git a/src/SketchSolver/SketchSolver_ConstraintAngle.cpp b/src/SketchSolver/SketchSolver_ConstraintAngle.cpp index d255da0e3..895f99e62 100644 --- a/src/SketchSolver/SketchSolver_ConstraintAngle.cpp +++ b/src/SketchSolver/SketchSolver_ConstraintAngle.cpp @@ -46,17 +46,29 @@ void SketchSolver_ConstraintAngle::adjustConstraint() if (!anIntersection) return; double aDist[2][2]; - for (int i = 0; i < 2; i++) + for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) aDist[i][j] = anIntersection->distance(aPoints[i][j]); + if (aDist[i][0] > tolerance && aDist[i][1] > tolerance && + aDist[i][0] + aDist[i][1] < aPoints[i][0]->distance(aPoints[i][1]) + 2.0 * tolerance) { + // the intersection point is an inner point of the line, + // we change the sign of distance till start point to calculate correct coordinates + // after rotation + aDist[i][0] *= -1.0; + } + } std::shared_ptr aDir[2]; for (int i = 0; i < 2; i++) - if (aDist[i][1] > aDist[i][0]) + if (aDist[i][1] > fabs(aDist[i][0])) aDir[i] = std::shared_ptr(new GeomAPI_Dir2d( aPoints[i][1]->xy()->decreased(anIntersection->xy()))); - else + else { aDir[i] = std::shared_ptr(new GeomAPI_Dir2d( aPoints[i][0]->xy()->decreased(anIntersection->xy()))); + // main direction is opposite => change signs + aDist[i][0] *= -1.0; + aDist[i][1] *= -1.0; + } aConstraint.other = false; for (int i = 0; i < 2; i++) -- 2.39.2