diff --git a/src/libs/vlayout/vcontour.cpp b/src/libs/vlayout/vcontour.cpp index 44931d241..0d4adffa1 100644 --- a/src/libs/vlayout/vcontour.cpp +++ b/src/libs/vlayout/vcontour.cpp @@ -302,6 +302,14 @@ const QPointF &VContour::at(int i) const return d->globalContour.at(i); } +//--------------------------------------------------------------------------------------------------------------------- +QRectF VContour::BoundingRect() const +{ + QVector points = GetContour(); + points.append(points.first()); + return QPolygonF(points).boundingRect(); +} + //--------------------------------------------------------------------------------------------------------------------- void VContour::AppendWhole(QVector &contour, const VLayoutDetail &detail, int detJ) const { diff --git a/src/libs/vlayout/vcontour.h b/src/libs/vlayout/vcontour.h index 3fe7bcb97..c8d1330e4 100644 --- a/src/libs/vlayout/vcontour.h +++ b/src/libs/vlayout/vcontour.h @@ -39,6 +39,7 @@ class VContourData; class QPointF; class VLayoutDetail; class QLineF; +class QRectF; class VContour { @@ -49,11 +50,11 @@ public: VContour &operator=(const VContour &contour); ~VContour(); - void SetContour(const QVector &contour); + void SetContour(const QVector &contour); QVector GetContour() const; quint32 GetShift() const; - void SetShift(quint32 shift); + void SetShift(quint32 shift); int GetHeight() const; void SetHeight(int height); @@ -73,6 +74,8 @@ public: const QPointF & at(int i) const; + QRectF BoundingRect() const; + private: QSharedDataPointer d; diff --git a/src/libs/vlayout/vposition.cpp b/src/libs/vlayout/vposition.cpp index 68dd79b6c..cbfa5e828 100644 --- a/src/libs/vlayout/vposition.cpp +++ b/src/libs/vlayout/vposition.cpp @@ -410,6 +410,14 @@ bool VPosition::CheckRotationEdges(VLayoutDetail &detail, int j, int dEdge, int //--------------------------------------------------------------------------------------------------------------------- VPosition::CrossingType VPosition::Crossing(const VLayoutDetail &detail, const int &globalI, const int &detailI) const { + const QRectF dRect = detail.BoundingRect(); + const QRectF gRect = gContour.BoundingRect(); + if (not gRect.intersects(dRect)) + { + // This we can determine efficiently. + return CrossingType::NoIntersection; + } + int globalEdgesCount = gContour.GlobalEdgesCount(); if (globalEdgesCount == 0) {