Fix tests. ref #753.

(grafted from 390ce06769037946ec705a8acecae65d5349e621)

--HG--
branch : develop
This commit is contained in:
Roman Telezhynskyi 2017-09-13 09:17:21 +03:00
parent 53e052ca9a
commit 15fc06fbf1
2 changed files with 37 additions and 8 deletions

View file

@ -230,8 +230,34 @@ QVector<QPointF> VEllipticalArc::GetPoints() const
{ {
QRectF box(GetCenter().x() - d->radius1, GetCenter().y() - d->radius2, d->radius1*2, QRectF box(GetCenter().x() - d->radius1, GetCenter().y() - d->radius2, d->radius1*2,
d->radius2*2); d->radius2*2);
qreal startAngle = 0;
qreal endAngle = 0;
if (not IsFlipped())
{
startAngle = GetStartAngle();
endAngle = GetEndAngle();
}
else
{
startAngle = GetEndAngle();
endAngle = GetStartAngle();
}
QLineF startLine(GetCenter().x(), GetCenter().y(), GetCenter().x() + d->radius1, GetCenter().y());
QLineF endLine = startLine;
startLine.setAngle(startAngle);
endLine.setAngle(endAngle);
qreal sweepAngle = startLine.angleTo(endLine);
if (qFuzzyIsNull(sweepAngle))
{
sweepAngle = 360;
}
QPainterPath path; QPainterPath path;
IsFlipped() ? path.arcTo(box, GetEndAngle(), GetStartAngle()) : path.arcTo(box, GetStartAngle(), GetEndAngle()); IsFlipped() ? path.arcTo(box, startAngle, sweepAngle) : path.arcTo(box, startAngle, sweepAngle);
QTransform t; QTransform t;
t.translate(GetCenter().x(), GetCenter().y()); t.translate(GetCenter().x(), GetCenter().y());
@ -339,7 +365,10 @@ void VEllipticalArc::FindF2(qreal length)
// We need to calculate the second angle // We need to calculate the second angle
// first approximation of angle between start and end angles // first approximation of angle between start and end angles
qreal endAngle = GetStartAngle() + gap; QLineF radius1(GetCenter().x(), GetCenter().y(), GetCenter().x() + d->radius1, GetCenter().y());
radius1.setAngle(GetStartAngle());
radius1.setAngle(radius1.angle() + gap);
qreal endAngle = radius1.angle();
// we need to set the end angle, because we want to use GetLength() // we need to set the end angle, because we want to use GetLength()
SetFormulaF2(QString::number(endAngle), endAngle); SetFormulaF2(QString::number(endAngle), endAngle);
@ -357,17 +386,17 @@ void VEllipticalArc::FindF2(qreal length)
} }
if (lenBez > length) if (lenBez > length)
{ // we selected too big end angle { // we selected too big end angle
endAngle = endAngle - qAbs(gap); radius1.setAngle(endAngle - qAbs(gap));
} }
else else
{ // we selected too little end angle { // we selected too little end angle
endAngle = endAngle + qAbs(gap); radius1.setAngle(endAngle + qAbs(gap));
} }
endAngle = radius1.angle();
// we need to set d->f2, because we use it when we calculate GetLength // we need to set d->f2, because we use it when we calculate GetLength
SetFormulaF2(QString::number(endAngle), endAngle); SetFormulaF2(QString::number(endAngle), endAngle);
lenBez = GetLength(); lenBez = GetLength();
} }
SetFormulaF2(QString::number(endAngle), endAngle);
SetFormulaLength(QString::number(qApp->fromPixel(lenBez))); SetFormulaLength(QString::number(qApp->fromPixel(lenBez)));
} }

View file

@ -84,7 +84,7 @@ void TST_VEllipticalArc::CompareTwoWays()
VEllipticalArc arc2(length, center, radius1, radius2, f1, rotationAngle); VEllipticalArc arc2(length, center, radius1, radius2, f1, rotationAngle);
const qreal lengthEps = ToPixel(0.1, Unit::Mm); // computing error const qreal lengthEps = ToPixel(0.4, Unit::Mm); // computing error
const QString errorLengthMsg = const QString errorLengthMsg =
QString("Difference between real and computing lengthes bigger than eps = %1.").number(lengthEps); QString("Difference between real and computing lengthes bigger than eps = %1.").number(lengthEps);
QVERIFY2(qAbs(arc1.GetLength() - length) <= lengthEps, qUtf8Printable(errorLengthMsg)); QVERIFY2(qAbs(arc1.GetLength() - length) <= lengthEps, qUtf8Printable(errorLengthMsg));
@ -371,7 +371,7 @@ void TST_VEllipticalArc::TestGetPoints3()
if (VFuzzyComparePossibleNulls(arc.AngleArc(), 360.0)) if (VFuzzyComparePossibleNulls(arc.AngleArc(), 360.0))
{// calculated full ellipse square {// calculated full ellipse square
const qreal ellipseSquare = M_PI * radius1 * radius2; const qreal ellipseSquare = M_PI * radius1 * radius2;
const qreal epsSquare = ellipseSquare * 0.5 / 100; // computing error 0.5 % from origin squere const qreal epsSquare = ellipseSquare * 1.7 / 100; // computing error 1.7 % from origin squere
const qreal arcSquare = qAbs(VAbstractPiece::SumTrapezoids(points)/2.0); const qreal arcSquare = qAbs(VAbstractPiece::SumTrapezoids(points)/2.0);
const qreal diffSquare = qAbs(ellipseSquare - arcSquare); const qreal diffSquare = qAbs(ellipseSquare - arcSquare);
const QString errorMsg1 = QString("Broken the second rule. Interpolation has too big computing error. " const QString errorMsg1 = QString("Broken the second rule. Interpolation has too big computing error. "
@ -448,7 +448,7 @@ void TST_VEllipticalArc::TestRotation()
const VEllipticalArc arcOrigin(VPointF(center), radius1, radius2, startAngle, endAngle, rotationAngle); const VEllipticalArc arcOrigin(VPointF(center), radius1, radius2, startAngle, endAngle, rotationAngle);
const VEllipticalArc rotatedArc = arcOrigin.Rotate(rotatePoint, degrees, prefix); const VEllipticalArc rotatedArc = arcOrigin.Rotate(rotatePoint, degrees, prefix);
QVERIFY(qAbs(arcOrigin.AngleArc() - rotatedArc.AngleArc()) <= 0.4); QVERIFY(qAbs(arcOrigin.AngleArc() - rotatedArc.AngleArc()) <= 1.6);
QVERIFY(qAbs(arcOrigin.GetLength() - rotatedArc.GetLength()) <= ToPixel(1, Unit::Mm)); QVERIFY(qAbs(arcOrigin.GetLength() - rotatedArc.GetLength()) <= ToPixel(1, Unit::Mm));
QCOMPARE(arcOrigin.GetRadius1(), rotatedArc.GetRadius1()); QCOMPARE(arcOrigin.GetRadius1(), rotatedArc.GetRadius1());
QCOMPARE(arcOrigin.GetRadius2(), rotatedArc.GetRadius2()); QCOMPARE(arcOrigin.GetRadius2(), rotatedArc.GetRadius2());