From 2717382d71ec1b5e946638614dd69d9cff4656c8 Mon Sep 17 00:00:00 2001 From: Roman Telezhynskyi Date: Sun, 10 Apr 2016 18:03:15 +0300 Subject: [PATCH] Rotation VSpline and VSplinePath classes. --HG-- branch : feature --- src/libs/vgeometry/vspline.cpp | 16 ++++++++++++++- src/libs/vgeometry/vspline.h | 1 + src/libs/vgeometry/vsplinepath.cpp | 31 ++++++++++++++++++++++++------ src/libs/vgeometry/vsplinepath.h | 1 + 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/libs/vgeometry/vspline.cpp b/src/libs/vgeometry/vspline.cpp index 9fb3eef30..894b389d6 100644 --- a/src/libs/vgeometry/vspline.cpp +++ b/src/libs/vgeometry/vspline.cpp @@ -103,12 +103,26 @@ VSpline::VSpline(VPointF p1, VPointF p4, qreal angle1, const QString &angle1Form const QString &angle2Formula, qreal c1Length, const QString &c1LengthFormula, qreal c2Length, const QString &c2LengthFormula, quint32 idObject, Draw mode) : VAbstractCubicBezier(GOType::Spline, idObject, mode), - d(new VSplineData(p1, p4, angle1, angle1Formula, angle2,angle2Formula, c1Length, c1LengthFormula, c2Length, + d(new VSplineData(p1, p4, angle1, angle1Formula, angle2, angle2Formula, c1Length, c1LengthFormula, c2Length, c2LengthFormula)) { CreateName(); } +//--------------------------------------------------------------------------------------------------------------------- +VSpline VSpline::Rotate(const QPointF &originPoint, qreal degrees, const QString &prefix) const +{ + const VPointF p1 = GetP1().Rotate(originPoint, degrees); + const VPointF p4 = GetP4().Rotate(originPoint, degrees); + + const QPointF p2 = VPointF::RotatePF(originPoint, GetP2(), degrees); + const QPointF p3 = VPointF::RotatePF(originPoint, GetP3(), degrees); + + VSpline spl(p1, p2, p3, p4); + spl.setName(name() + prefix); + return spl; +} + //--------------------------------------------------------------------------------------------------------------------- VSpline::~VSpline() {} diff --git a/src/libs/vgeometry/vspline.h b/src/libs/vgeometry/vspline.h index c92e4f907..5b0de7ac7 100644 --- a/src/libs/vgeometry/vspline.h +++ b/src/libs/vgeometry/vspline.h @@ -52,6 +52,7 @@ public: VSpline (VPointF p1, VPointF p4, qreal angle1, const QString &angle1Formula, qreal angle2, const QString &angle2Formula, qreal c1Length, const QString &c1LengthFormula, qreal c2Length, const QString &c2LengthFormula, quint32 idObject = 0, Draw mode = Draw::Calculation); + VSpline Rotate(const QPointF &originPoint, qreal degrees, const QString &prefix = QString()) const; virtual ~VSpline(); VSpline &operator=(const VSpline &spl); diff --git a/src/libs/vgeometry/vsplinepath.cpp b/src/libs/vgeometry/vsplinepath.cpp index 64a2a5590..bd4ad9879 100644 --- a/src/libs/vgeometry/vsplinepath.cpp +++ b/src/libs/vgeometry/vsplinepath.cpp @@ -57,12 +57,7 @@ VSplinePath::VSplinePath(const QVector &points, qreal kCurve, qui return; } - QVector newPoints; - for (int i=0; i < points.size(); ++i) - { - newPoints.append(VSplinePoint()); - } - + QVector newPoints(points.size()); for (qint32 i = 1; i <= points.size()-1; ++i) { const VFSplinePoint &p1 = points.at(i-1); @@ -106,6 +101,30 @@ VSplinePath::VSplinePath(const VSplinePath &splPath) d(splPath.d) {} +//--------------------------------------------------------------------------------------------------------------------- +VSplinePath VSplinePath::Rotate(const QPointF &originPoint, qreal degrees, const QString &prefix) const +{ + QVector newPoints(CountPoints()); + for (qint32 i = 1; i <= CountSubSpl(); ++i) + { + const VSplinePoint &p1 = d->path.at(i-1); + const VSplinePoint &p2 = d->path.at(i); + VSpline spl = GetSpline(i).Rotate(originPoint, degrees); + + newPoints[i-1].SetP(p1.P()); + newPoints[i-1].SetAngle2(p1.Angle2(), spl.GetStartAngleFormula()); + newPoints[i-1].SetLength2(spl.GetC1Length(), spl.GetC1LengthFormula()); + + newPoints[i].SetP(p2.P()); + newPoints[i].SetAngle1(p2.Angle1(), spl.GetEndAngleFormula()); + newPoints[i].SetLength1(spl.GetC2Length(), spl.GetC2LengthFormula()); + } + + VSplinePath splPath(newPoints); + splPath.setName(name() + prefix); + return splPath; +} + //--------------------------------------------------------------------------------------------------------------------- VSplinePath::~VSplinePath() {} diff --git a/src/libs/vgeometry/vsplinepath.h b/src/libs/vgeometry/vsplinepath.h index a683065c1..2b0b7608b 100644 --- a/src/libs/vgeometry/vsplinepath.h +++ b/src/libs/vgeometry/vsplinepath.h @@ -50,6 +50,7 @@ public: Draw mode = Draw::Calculation); VSplinePath(const QVector &points, quint32 idObject = 0, Draw mode = Draw::Calculation); VSplinePath(const VSplinePath& splPath); + VSplinePath Rotate(const QPointF &originPoint, qreal degrees, const QString &prefix = QString()) const; virtual ~VSplinePath() Q_DECL_OVERRIDE; VSplinePath &operator=(const VSplinePath &path);