From 714a4e17155878736819e8ca7dcccfdbd093e127 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Fri, 19 Aug 2022 08:29:42 +0300 Subject: [PATCH] Fix segmenting a simple curve. --- src/libs/vgeometry/vabstractcubicbezier.cpp | 2 +- src/test/ValentinaTest/tst_vspline.cpp | 42 ++++++++++++++++++--- src/test/ValentinaTest/tst_vspline.h | 1 + 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/libs/vgeometry/vabstractcubicbezier.cpp b/src/libs/vgeometry/vabstractcubicbezier.cpp index 9219768d5..02492bfcb 100644 --- a/src/libs/vgeometry/vabstractcubicbezier.cpp +++ b/src/libs/vgeometry/vabstractcubicbezier.cpp @@ -520,7 +520,7 @@ auto VAbstractCubicBezier::GetParmT(qreal length) const -> qreal length = base; } - Q_DECL_RELAXED_CONSTEXPR qreal eps = ToPixel(0.0001, Unit::Mm); + Q_DECL_RELAXED_CONSTEXPR qreal eps = ToPixel(0.00001, Unit::Mm); qreal parT = 0.5; qreal step = parT; qreal splLength = 0; diff --git a/src/test/ValentinaTest/tst_vspline.cpp b/src/test/ValentinaTest/tst_vspline.cpp index f930ceafd..eaee5b45b 100644 --- a/src/test/ValentinaTest/tst_vspline.cpp +++ b/src/test/ValentinaTest/tst_vspline.cpp @@ -850,9 +850,13 @@ void TST_VSpline::TestFlip() } //--------------------------------------------------------------------------------------------------------------------- -// See file valentina_private_collection/bugs/men_jacket/issue_cut_spline.val (private collection) -void TST_VSpline::TestCutSpline() +void TST_VSpline::TestCutSpline_data() { + QTest::addColumn("spl"); + QTest::addColumn("result"); + QTest::addColumn("name"); + + { VPointF p1(187.31716535433043, 51.31464566929152, QStringLiteral("p1"), 140.42872440944885, -22.62372283464567); VPointF p4(-991.8954330708666, 9.739842519685212, QStringLiteral("p4"), 9.999987401574804, 15.0); @@ -860,8 +864,36 @@ void TST_VSpline::TestCutSpline() QStringLiteral("Line_Г3_Г6*1.1"), 226.7716535433071, QStringLiteral("6")); spl.SetApproximationScale(0.5); - const QString name(QStringLiteral("з")); - const qreal result = 1.35; // Correct distance in cm. + QString name(QStringLiteral("з")); + qreal result = 1.35; // Correct distance in cm. + + // See file valentina_private_collection/bugs/men_jacket/issue_cut_spline.val (private collection) + // Size 54 produces incorrect spline segment distance + QTest::newRow("Size 54") << spl << result << name; + } + + { + VPointF p1(1898.0384322000489, -143.17624447113994, QStringLiteral("p1"), 9.999987401574804, -105.35848818897638); + VPointF p4(1557.8809518850883, -143.17624447113994, QStringLiteral("p4"), 9.999987401574804, 15.0); + + VSpline spl(p1, p4, 175.0, QStringLiteral("175"), 5.0, QStringLiteral("5"), 151.18110236220474, + QStringLiteral("4"), 151.18110236220474, QStringLiteral("4")); + + + QString name(QStringLiteral("А193")); + const qreal result = 4.5090698038574057; // Correct distance in cm. + // See file valentina_private_collection/bugs/coat/coat.val (private collection) + QTest::newRow("Half of a curve") << spl << result << name; + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void TST_VSpline::TestCutSpline() +{ + QFETCH(VSpline, spl); + QFETCH(qreal, result); + QFETCH(QString, name); + QPointF spl1p2, spl1p3, spl2p2, spl2p3; QPointF point = spl.CutSpline(UnitConvertor(result, Unit::Cm, Unit::Px), spl1p2, spl1p3, spl2p2, spl2p3, name); @@ -870,8 +902,6 @@ void TST_VSpline::TestCutSpline() VSpline spline1(spl.GetP1(), spl1p2, spl1p3, p); spline1.SetApproximationScale(0.5); - // Size 54 produces incorrect spline segment distance - Q_DECL_RELAXED_CONSTEXPR qreal eps = ToPixel(0.0001, Unit::Mm); QVERIFY(UnitConvertor(spline1.GetLength(), Unit::Px, Unit::Cm) - result < eps); } diff --git a/src/test/ValentinaTest/tst_vspline.h b/src/test/ValentinaTest/tst_vspline.h index e62da0bf1..a79aaa803 100644 --- a/src/test/ValentinaTest/tst_vspline.h +++ b/src/test/ValentinaTest/tst_vspline.h @@ -56,6 +56,7 @@ private slots: void TestLengthByPoint(); void TestFlip_data(); void TestFlip(); + void TestCutSpline_data(); void TestCutSpline(); private: