From 63e402ba8aeadfdb7992dfeb2c0503e82446a087 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Tue, 12 Feb 2019 14:51:21 +0200 Subject: [PATCH] Resolved issue #937. Wrong symmetrical seam corners on pieces. (grafted from f15fbf536959418dcd9a2f2caf7c0267ae46eaee) --HG-- branch : develop --- ChangeLog.txt | 1 + src/app/share/collection/bugs/Issue_#934.val | 96 ++++++ src/libs/vlayout/vabstractpiece.cpp | 180 +++++----- src/test/ValentinaTest/tst_vabstractpiece.cpp | 326 +++++++++++++++++- src/test/ValentinaTest/tst_vabstractpiece.h | 9 + 5 files changed, 516 insertions(+), 96 deletions(-) create mode 100644 src/app/share/collection/bugs/Issue_#934.val diff --git a/ChangeLog.txt b/ChangeLog.txt index 7d697dbd7..c6e40eaed 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -25,6 +25,7 @@ - [#931] Variable translation for Greek and Chinese are broken. - [#938] Dialog Seam Allowance doesn't block user from saving broken formula. - [#939] Calling Formula Wizard through property explorer doesn't refresh formula. +- [#937] Wrong symmetrical seam corners on pieces. # Version 0.6.1 October 23, 2018 - [#885] Regression. Broken support for multi size measurements. diff --git a/src/app/share/collection/bugs/Issue_#934.val b/src/app/share/collection/bugs/Issue_#934.val new file mode 100644 index 000000000..71b53bc9e --- /dev/null +++ b/src/app/share/collection/bugs/Issue_#934.val @@ -0,0 +1,96 @@ + + + + 0.7.12 + cm + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
diff --git a/src/libs/vlayout/vabstractpiece.cpp b/src/libs/vlayout/vabstractpiece.cpp index f025a0d7e..49e57e8eb 100644 --- a/src/libs/vlayout/vabstractpiece.cpp +++ b/src/libs/vlayout/vabstractpiece.cpp @@ -294,14 +294,14 @@ QVector AngleByIntersection(const QVector &points, QPointF p1, QLineF::IntersectType type = edge2.intersect(bigLine1, &px); if (type == QLineF::NoIntersection) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px)) { if (QLineF(p2, px).length() > localWidth*maxL) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } pointsIntr.append(px); } @@ -322,7 +322,7 @@ QVector AngleByIntersection(const QVector &points, QPointF p1, type = edge1.intersect(bigLine2, &px); if (type == QLineF::NoIntersection) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px)) @@ -351,57 +351,56 @@ QVector AngleByFirstSymmetry(const QVector &points, QPointF p1 *needRollback = false; } - const qreal localWidth = p.MaxLocalSA(width); - QVector pointsIntr = points; - QLineF sEdge(VPointF::FlipPF(bigLine2, p1), VPointF::FlipPF(bigLine2, p2)); - QPointF px; - QLineF::IntersectType type = sEdge.intersect(bigLine1, &px); + QPointF px1; + QLineF::IntersectType type = sEdge.intersect(bigLine1, &px1); if (type == QLineF::NoIntersection) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } - if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px)) - { - if (QLineF(p2, px).length() > localWidth*maxL) - { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); - } - pointsIntr.append(px); - } - else - {// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points - bool success = false; - pointsIntr = VAbstractPiece::RollbackSeamAllowance(pointsIntr, bigLine2, &success); - - if (needRollback != nullptr) - { - *needRollback = true; - } - } - - type = sEdge.intersect(bigLine2, &px); + QPointF px2; + type = sEdge.intersect(bigLine2, &px2); if (type == QLineF::NoIntersection) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } - if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px)) + QVector pointsIntr = points; + + if (IsOutsidePoint(sp2, bigLine1.p1(), px1) && IsOutsidePoint(sp2, bigLine2.p2(), px2)) { - if (QLineF(p2, px).length() > localWidth*maxL) + if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px1)) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + pointsIntr.append(px1); + } + else + {// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points + bool success = false; + pointsIntr = VAbstractPiece::RollbackSeamAllowance(pointsIntr, sEdge, &success); + + if (needRollback != nullptr) + { + *needRollback = true; + } + } + + if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px2)) + { + pointsIntr.append(px2); + } + else + { + QLineF allowance(px2, p2); + allowance.setAngle(allowance.angle() + 90); + pointsIntr.append(allowance.p2()); + pointsIntr.append(bigLine2.p1()); } - pointsIntr.append(px); } else { - QLineF allowance(px, p2); - allowance.setAngle(allowance.angle() + 90); - pointsIntr.append(allowance.p2()); - pointsIntr.append(bigLine2.p1()); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } return pointsIntr; @@ -417,65 +416,64 @@ QVector AngleBySecondSymmetry(const QVector &points, QPointF p *needRollback = false; } + QLineF sEdge(VPointF::FlipPF(bigLine1, p2), VPointF::FlipPF(bigLine1, p3)); + + QPointF px1; + QLineF::IntersectType type = sEdge.intersect(bigLine1, &px1); + if (type == QLineF::NoIntersection) + { + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); + } + + QPointF px2; + type = sEdge.intersect(bigLine2, &px2); + if (type == QLineF::NoIntersection) + { + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); + } + const qreal localWidth = p.MaxLocalSA(width); QVector pointsIntr = points; - QLineF sEdge(VPointF::FlipPF(bigLine1, p2), VPointF::FlipPF(bigLine1, p3)); - - QPointF px; - QLineF::IntersectType type = sEdge.intersect(bigLine1, &px); - if (type == QLineF::NoIntersection) + if (IsOutsidePoint(sp2, bigLine1.p1(), px1) && IsOutsidePoint(sp2, bigLine2.p2(), px2)) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); - } - - bool rollbackFlag = false; - if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px)) - { - if (QLineF(p2, px).length() > localWidth*maxL) + bool rollbackFlag = false; + if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px1)) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + pointsIntr.append(px1); } - pointsIntr.append(px); - } - else - {// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points - bool success = false; - pointsIntr = VAbstractPiece::RollbackSeamAllowance(pointsIntr, bigLine2, &success); - rollbackFlag = true; + else + {// Because artificial loop can lead to wrong clipping we must rollback current seam allowance points + bool success = false; + pointsIntr = VAbstractPiece::RollbackSeamAllowance(pointsIntr, sEdge, &success); + rollbackFlag = true; - if (needRollback != nullptr) - { - *needRollback = true; - } - } - - type = sEdge.intersect(bigLine2, &px); - if (type == QLineF::NoIntersection) - { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); - } - - if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px)) - { - if (QLineF(p2, px).length() > localWidth*maxL) - { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + if (needRollback != nullptr) + { + *needRollback = true; + } } - if (not rollbackFlag) + if (IsOutsidePoint(bigLine2.p2(), bigLine2.p1(), px2)) { - pointsIntr.append(px); + if (not rollbackFlag) + { + pointsIntr.append(px2); + } + } + else + { + QLineF allowance(p2, px2); + allowance.setLength(p.GetSAAfter(width)*0.98); + pointsIntr.append(allowance.p2()); + allowance.setLength(allowance.length() + localWidth * 3.); + pointsIntr.append(allowance.p2()); + pointsIntr.append(bigLine2.p2()); } } else { - QLineF allowance(p2, px); - allowance.setLength(p.GetSAAfter(width)*0.98); - pointsIntr.append(allowance.p2()); - allowance.setLength(allowance.length() + localWidth * 3.); - pointsIntr.append(allowance.p2()); - pointsIntr.append(bigLine2.p2()); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } return pointsIntr; @@ -484,7 +482,7 @@ QVector AngleBySecondSymmetry(const QVector &points, QPointF p //--------------------------------------------------------------------------------------------------------------------- QVector AngleByFirstRightAngle(const QVector &points, QPointF p1, QPointF p2, const QLineF &bigLine1, QPointF sp2, const QLineF &bigLine2, - const VSAPoint &p, qreal width) + const VSAPoint &p, qreal width, bool *needRollback = nullptr) { const qreal localWidth = p.MaxLocalSA(width); QVector pointsRA = points; @@ -494,7 +492,7 @@ QVector AngleByFirstRightAngle(const QVector &points, QPointF QLineF::IntersectType type = edge.intersect(bigLine2, &px); if (type == QLineF::NoIntersection) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } QLineF seam(px, p1); @@ -507,7 +505,7 @@ QVector AngleByFirstRightAngle(const QVector &points, QPointF { if (QLineF(p2, px).length() > localWidth*maxL) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } pointsRA.append(seam.p1()); } @@ -544,14 +542,14 @@ QVector AngleBySecondRightAngle(QVector points, QPointF p2, QP QLineF::IntersectType type = edge.intersect(bigLine1, &px); if (type == QLineF::NoIntersection) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } if (IsOutsidePoint(bigLine1.p1(), bigLine1.p2(), px)) { if (QLineF(p2, px).length() > localWidth*maxL) { - return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width); + return AngleByLength(points, p2, bigLine1, sp2, bigLine2, p, width, needRollback); } points.append(px); @@ -902,7 +900,7 @@ QVector VAbstractPiece::Equidistant(QVector points, qreal wid return QVector(); } -// DumpVector(points); // Uncomment for dumping test data + DumpVector(points); // Uncomment for dumping test data points = CorrectEquidistantPoints(points); if ( points.size() < 3 ) @@ -1020,7 +1018,7 @@ QVector VAbstractPiece::Equidistant(QVector points, qreal wid const bool removeFirstAndLast = false; ekvPoints = CheckLoops(CorrectEquidistantPoints(ekvPoints, removeFirstAndLast));//Result path can contain loops ekvPoints = CheckLoops(CorrectEquidistantPoints(ekvPoints, removeFirstAndLast));//Result path can contain loops -// DumpVector(ekvPoints); // Uncomment for dumping test data + DumpVector(ekvPoints); // Uncomment for dumping test data return ekvPoints; } @@ -1305,7 +1303,7 @@ QT_WARNING_DISABLE_GCC("-Wswitch-default") p2Line1, width, needRollback); case PieceNodeAngle::ByFirstEdgeRightAngle: return AngleByFirstRightAngle(points, p1Line1, p2Line1, bigLine1, crosPoint, bigLine2, - p2Line1, width); + p2Line1, width, needRollback); case PieceNodeAngle::BySecondEdgeRightAngle: return AngleBySecondRightAngle(points, p2Line1, p1Line2, bigLine1, crosPoint, bigLine2, p2Line1, width, needRollback); diff --git a/src/test/ValentinaTest/tst_vabstractpiece.cpp b/src/test/ValentinaTest/tst_vabstractpiece.cpp index 851862b20..eda7f48db 100644 --- a/src/test/ValentinaTest/tst_vabstractpiece.cpp +++ b/src/test/ValentinaTest/tst_vabstractpiece.cpp @@ -5006,6 +5006,21 @@ void TST_VAbstractPiece::EquidistantAngleType_data() const // See the file "collection/bugs/Issue_#880.val" QTest::newRow("Issue #880. Piece: Detail_1.") << InputPointsIssue880_Piece_Detail_1() << 75.59055118110237 << OutputPointsIssue880_Piece_Detail_1(); + + // See file src/app/share/collection/bugs/Issue_#934.val + QTest::newRow("Issue 934. Case1") << InputPointsIssue934Case1() + << 37.795275590551185 // seam allowance width (1.0 cm) + << OutputPointsIssue934Case1(); + + // See file src/app/share/collection/bugs/Issue_#934.val + QTest::newRow("Issue 934. Case2") << InputPointsIssue934Case2() + << 37.795275590551185 // seam allowance width (1.0 cm) + << OutputPointsIssue934Case2(); + + // See file src/app/share/collection/bugs/Issue_#934.val + QTest::newRow("Issue 934. Case3") << InputPointsIssue934Case3() + << 37.795275590551185 // seam allowance width (1.0 cm) + << OutputPointsIssue934Case3(); } //--------------------------------------------------------------------------------------------------------------------- @@ -10165,8 +10180,7 @@ QVector TST_VAbstractPiece::OutputPointsIssue923Test3_3() { QVector points; - points += QPointF(-998.323622337918891, 229.426313313416387); - points += QPointF(-925.469085441362722, 240.352497361176461); + points += QPointF(-941.393414608898865, 276.182237988132670); points += QPointF(-814.172528355339296, -10.064756082376469); points += QPointF(-797.048974584331063, -48.592752067144829); points += QPointF(-778.560274683193597, -50.549491761193529); @@ -10224,7 +10238,7 @@ QVector TST_VAbstractPiece::OutputPointsIssue923Test3_3() points += QPointF(-823.692975528084730, 369.271805550997954); points += QPointF(-829.575336882823422, 366.626948794191208); points += QPointF(-835.815139714856855, 362.892089667033019); - points += QPointF(-998.323622337918891, 229.426313313416387); + points += QPointF(-941.393414608898865, 276.182237988132670); return points; } @@ -10577,6 +10591,7 @@ QVector TST_VAbstractPiece::OutputPointsIssue923Test4_4() { QVector points; + points += QPointF(-941.393414608898865, 276.182237988132670); points += QPointF(-814.172528355339296, -10.064756082376469); points += QPointF(-797.048974584331063, -48.592752067144829); points += QPointF(-778.560274683193597, -50.549491761193529); @@ -10634,8 +10649,7 @@ QVector TST_VAbstractPiece::OutputPointsIssue923Test4_4() points += QPointF(-823.692975528084730, 369.271805550997954); points += QPointF(-829.575336882823422, 366.626948794191208); points += QPointF(-835.815139714856855, 362.892089667033019); - points += QPointF(-949.648673098827885, 294.756569590472964); - points += QPointF(-814.172528355339296, -10.064756082376469); + points += QPointF(-941.393414608898865, 276.182237988132670); return points; } @@ -11459,3 +11473,305 @@ QVector TST_VAbstractPiece::OutputPointsIssue923Test6_6() return points; } + +//--------------------------------------------------------------------------------------------------------------------- +QVector TST_VAbstractPiece::InputPointsIssue934Case1() const +{ + QVector points; + + points += VSAPoint(30.000000000000000, 39.999874015748034); + points += VSAPoint(784.001052525227124, 93.624081022807857); + + VSAPoint p = VSAPoint(603.941048041563704, 630.489688374883372); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::BySecondEdgeSymmetry); + points += p; + + p = VSAPoint(149.328168036696184, 622.197225159899745); + p.SetSABefore(151.181); + p.SetAngleType(PieceNodeAngle::ByFirstEdgeSymmetry); + points += p; + + return points; +} + +//--------------------------------------------------------------------------------------------------------------------- +QVector TST_VAbstractPiece::OutputPointsIssue934Case1() const +{ + QVector points; + + points += QPointF(-17.032721988884830, -1.235810543606590); + points += QPointF(835.348863103112194, 59.385174553028691); + points += QPointF(593.158150600486692, 781.499251666420946); + points += QPointF(141.710194441569911, 773.264518919985676); + points += QPointF(-17.032721988884830, -1.235810543606590); + + return points; +} + +//--------------------------------------------------------------------------------------------------------------------- +QVector TST_VAbstractPiece::InputPointsIssue934Case2() const +{ + QVector points; + + points += VSAPoint(1133.858267716535465, 0.000000000000000); + points += VSAPoint(1626.414077999261963, 28.823250050281736); + + VSAPoint p = VSAPoint(1708.662782184241905, 444.933722174073409); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::BySecondEdgeSymmetry); + points += p; + + p = VSAPoint(978.059754412127063, 473.971248193821054); + p.SetSABefore(151.181); + p.SetAngleType(PieceNodeAngle::ByFirstEdgeSymmetry); + points += p; + + return points; +} + +//--------------------------------------------------------------------------------------------------------------------- +QVector TST_VAbstractPiece::OutputPointsIssue934Case2() const +{ + QVector points; + + points += QPointF(1107.034334293208985, -39.429607754508027); + points += QPointF(1657.820450488061852, -7.198852132733364); + points += QPointF(1746.889006868886554, 443.414436116223328); + points += QPointF(1282.672343168622319, 613.165002913536910); + points += QPointF(1117.870570870988558, 619.714983640807873); + points += QPointF(937.748317798697030, 475.573410168327655); + points += QPointF(1107.034334293208985, -39.429607754508027); + + return points; +} + +//--------------------------------------------------------------------------------------------------------------------- +QVector TST_VAbstractPiece::InputPointsIssue934Case3() const +{ + QVector points; + + points += VSAPoint(1133.858267716535465, 0.000000000000000); + points += VSAPoint(1626.414077999261963, 28.823250050281736); + points += VSAPoint(1626.414077999261963, 28.823250050281736); + + VSAPoint p = VSAPoint(1627.925525207237797, 60.028107039649264); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1632.474444857430171, 117.651054706235584); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1638.880247750070112, 170.780189339920014); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1647.171437175555184, 220.804740431454292); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1657.376516424283182, 269.113937471590248); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1669.523988786652353, 317.097009951079542); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1683.642357553060720, 366.143187360674062); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1699.760126013905392, 417.641699191125440); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1708.662782184241905, 444.933722174073409); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::BySecondEdgeSymmetry); + points += p; + + p = VSAPoint(1708.662782184241905, 444.933722174073409); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::BySecondEdgeSymmetry); + points += p; + + p = VSAPoint(1708.662782184241905, 444.933722174073409); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::BySecondEdgeSymmetry); + points += p; + + p = VSAPoint(1677.251229240104976, 451.246684764538941); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1605.086594041950320, 463.155242122690083); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1544.272339765547713, 471.094839513925308); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1501.274196476889529, 475.816264599789406); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1456.403111491504887, 479.956529052348401); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1409.875251575960647, 483.430528153818273); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1361.906783496823664, 486.153157186415115); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1312.713874020660569, 488.039311432354793); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1262.512689914038219, 489.003886173853402); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1211.519397943523927, 488.961776693126922); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1159.950164875684550, 487.827878272391445); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1108.021157477086035, 485.517086193862838); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1055.948542514296605, 481.944295739757194); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1003.948486753882094, 477.024402192290495); + p.SetSABefore(151.181); + p.SetSAAfter(151.181); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(978.059754412127063, 473.971248193821054); + p.SetSABefore(151.181); + p.SetAngleType(PieceNodeAngle::ByFirstEdgeSymmetry); + points += p; + + p = VSAPoint(978.059754412127063, 473.971248193821054); + p.SetSABefore(151.181); + p.SetAngleType(PieceNodeAngle::ByFirstEdgeSymmetry); + points += p; + + p = VSAPoint(978.059754412127063, 473.971248193821054); + p.SetSABefore(151.181); + p.SetAngleType(PieceNodeAngle::ByFirstEdgeSymmetry); + points += p; + + p = VSAPoint(984.500664049167881, 439.858339084691238); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(998.403341335729920, 374.895601998811230); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1013.735113164965696, 313.199834991297735); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1030.722718345428348, 254.050229972719023); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1049.592895685671465, 196.725978853643085); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1070.572383994247502, 140.506273544638077); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1093.887922079709597, 84.670305956272159); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + p = VSAPoint(1119.766248750610885, 28.497267999113369); + p.SetAngleType(PieceNodeAngle::ByLengthCurve); + points += p; + + points += VSAPoint(1133.858267716535465, 0.000000000000000); + + return points; +} + +//--------------------------------------------------------------------------------------------------------------------- +QVector TST_VAbstractPiece::OutputPointsIssue934Case3() const +{ + QVector points; + + points += QPointF(1111.075514893730315, -39.193127021735194); + points += QPointF(1662.522212799755380, -6.923715654880951); + points += QPointF(1665.648765146942878, 57.626086911110946); + points += QPointF(1670.091199415827987, 113.900142527237790); + points += QPointF(1676.303630411694712, 165.425468596995557); + points += QPointF(1684.322260121831278, 213.805541833033089); + points += QPointF(1694.200361802327961, 260.566879872136496); + points += QPointF(1706.013423451030349, 307.229014708540717); + points += QPointF(1719.842343091969724, 355.269667089451730); + points += QPointF(1735.830074328750925, 406.352691903936886); + points += QPointF(1745.972128474848887, 437.435445733357710); + points += QPointF(1575.039217266384640, 508.928892866275987); + points += QPointF(1302.519921954974052, 639.444186565335031); + points += QPointF(1263.902550577329066, 640.186187808469754); + points += QPointF(1209.795108673992672, 640.141506710349972); + points += QPointF(1154.927472101428293, 638.935083369183076); + points += QPointF(1099.485310435284873, 636.467959223881508); + points += QPointF(1043.652191269731475, 632.637154196705978); + points += QPointF(987.972975362633747, 627.369163402013896); + points += QPointF(940.434492417377328, 469.533961825903646); + points += QPointF(947.446497080812378, 432.396369275163750); + points += QPointF(961.574442359626801, 366.381027352609578); + points += QPointF(977.219989780144260, 303.422612688453626); + points += QPointF(994.595947496389158, 242.920792401422716); + points += QPointF(1013.924089039867795, 184.205327277493041); + points += QPointF(1035.416023464977798, 126.612396404806589); + points += QPointF(1059.274426966970623, 69.476376649892870); + points += QPointF(1085.656320891028145, 12.210265605542077); + points += QPointF(1111.075514893730315, -39.193127021735194); + + return points; +} diff --git a/src/test/ValentinaTest/tst_vabstractpiece.h b/src/test/ValentinaTest/tst_vabstractpiece.h index 163643aa3..6bcec309f 100644 --- a/src/test/ValentinaTest/tst_vabstractpiece.h +++ b/src/test/ValentinaTest/tst_vabstractpiece.h @@ -161,6 +161,15 @@ private: QVector InputPointsIssue923Test6_6(); QVector OutputPointsIssue923Test6_6(); + + QVector InputPointsIssue934Case1() const; + QVector OutputPointsIssue934Case1() const; + + QVector InputPointsIssue934Case2() const; + QVector OutputPointsIssue934Case2() const; + + QVector InputPointsIssue934Case3() const; + QVector OutputPointsIssue934Case3() const; }; #endif // TST_VABSTRACTPIECE_H