From ba1433e83f2864332f4de21033d8579f2e5fa5ab Mon Sep 17 00:00:00 2001 From: dismine Date: Tue, 17 Sep 2013 20:11:43 +0300 Subject: [PATCH] Added method CheckLoops for finding loops in equidistant. Can find loops and delete them. --- container/vcontainer.cpp | 49 ++++++++++++++++++++++++++++++++++- container/vcontainer.h | 1 + widgets/vmaingraphicsscene.h | 1 - widgets/vmaingraphicsview.cpp | 6 ----- widgets/vmaingraphicsview.h | 6 ----- 5 files changed, 49 insertions(+), 14 deletions(-) diff --git a/container/vcontainer.cpp b/container/vcontainer.cpp index 764dd140d..1a89c0011 100644 --- a/container/vcontainer.cpp +++ b/container/vcontainer.cpp @@ -258,7 +258,7 @@ QPainterPath VContainer::ContourPath(qint64 idDetail) const{ } break; default: - qWarning()<<"Get wrong tool type. Ignore."; + qWarning()<<"Get wrong tool type. Ignore."< points, const Detail::Equi //точка яка не лежить ні на початку ні в кінці ekvPoints< VContainer::EkvPoint(const QLineF &line1, const QLineF &line2, return points; } +QVector VContainer::CheckLoops(const QVector &points) const{ + QVector ekvPoints; + /*If we got less than 4 points no need seek loops.*/ + if(points.size() < 4){ + return ekvPoints; + } + bool closed = false; + if(points.at(0) == points.at(points.size()-1)){ + closed = true; + } + qint32 i, j; + for(i = 0; i < points.size(); ++i){ + /*Last three points no need check.*/ + if(i >= points.size()-3){ + ekvPoints.append(points.at(i)); + continue; + } + QPointF crosPoint; + QLineF::IntersectType intersect = QLineF::NoIntersection; + QLineF line1(points.at(i),points.at(i+1)); + for(j = i+2; j < points.size()-1; ++j){ + QLineF line2(points.at(j),points.at(j+1)); + intersect = line1.intersect(line2, &crosPoint); + if(intersect == QLineF::BoundedIntersection){ + break; + } + } + if(intersect == QLineF::BoundedIntersection){ + if(i == 0 && j+1 == points.size()-1 && closed){ + /*We got closed contour.*/ + ekvPoints.append(points.at(i)); + } else { + /*We found loop.*/ + ekvPoints.append(points.at(i)); + ekvPoints.append(crosPoint); + ekvPoints.append(points.at(j+1)); + i = j + 2; + } + } else { + /*We did not found loop.*/ + ekvPoints.append(points.at(i)); + } + } + return ekvPoints; +} + void VContainer::PrepareDetails(QVector &list) const{ QMapIterator iDetail(details); while (iDetail.hasNext()) { diff --git a/container/vcontainer.h b/container/vcontainer.h index eeaff8bf6..e7866e819 100644 --- a/container/vcontainer.h +++ b/container/vcontainer.h @@ -127,6 +127,7 @@ public: static QLineF ParallelLine(const QLineF &line, qreal width ); static QPointF SingleParallelPoint(const QLineF &line, const qreal &angle, const qreal &width); QVector EkvPoint(const QLineF &line1, const QLineF &line2, const qreal &width)const; + QVector CheckLoops(const QVector &points) const; void PrepareDetails(QVector & list)const; private: static qint64 _id; diff --git a/widgets/vmaingraphicsscene.h b/widgets/vmaingraphicsscene.h index f637f0d4e..7781cf0b4 100644 --- a/widgets/vmaingraphicsscene.h +++ b/widgets/vmaingraphicsscene.h @@ -4,7 +4,6 @@ #include #include #include - #include "options.h" class VMainGraphicsScene : public QGraphicsScene diff --git a/widgets/vmaingraphicsview.cpp b/widgets/vmaingraphicsview.cpp index 7ea0f4c69..987252e70 100644 --- a/widgets/vmaingraphicsview.cpp +++ b/widgets/vmaingraphicsview.cpp @@ -1,13 +1,7 @@ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Weffc++" -#pragma GCC diagnostic ignored "-Wconversion" -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wctor-dtor-privacy" #include "vmaingraphicsview.h" #include #include #include -#pragma GCC diagnostic pop VMainGraphicsView::VMainGraphicsView(QWidget *parent) : QGraphicsView(parent){ diff --git a/widgets/vmaingraphicsview.h b/widgets/vmaingraphicsview.h index 61da9dde3..cac90f23f 100644 --- a/widgets/vmaingraphicsview.h +++ b/widgets/vmaingraphicsview.h @@ -1,13 +1,7 @@ #ifndef VMAINGRAPHICSVIEW_H #define VMAINGRAPHICSVIEW_H -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Weffc++" -#pragma GCC diagnostic ignored "-Wconversion" -#pragma GCC diagnostic ignored "-Wsign-conversion" -#pragma GCC diagnostic ignored "-Wctor-dtor-privacy" #include -#pragma GCC diagnostic pop class VMainGraphicsView : public QGraphicsView {