From 059578e628fa76d81738efc62c36d414e901c2a6 Mon Sep 17 00:00:00 2001 From: Thomas Gubler Date: Sun, 19 Aug 2018 13:55:30 +0200 Subject: [PATCH] [Survey transects generation] add basic implementation for handling multiple polygons need to fully implement vertexvisibility --- src/MissionManager/SurveyComplexItem.cc | 85 ++++++++++++++++++++++++- src/MissionManager/SurveyComplexItem.h | 5 +- 2 files changed, 86 insertions(+), 4 deletions(-) diff --git a/src/MissionManager/SurveyComplexItem.cc b/src/MissionManager/SurveyComplexItem.cc index 3ab0367ee..36e886a53 100644 --- a/src/MissionManager/SurveyComplexItem.cc +++ b/src/MissionManager/SurveyComplexItem.cc @@ -1115,7 +1115,7 @@ void SurveyComplexItem::_rebuildTransectsPhase1Worker(bool refly) } // Create list of separate polygons - QList polygons; + QList polygons{}; _PolygonDecomposeConvex(polygon, polygons); // iterate over polygons @@ -1124,13 +1124,91 @@ void SurveyComplexItem::_rebuildTransectsPhase1Worker(bool refly) p << p.front(); // build transects for this polygon // TODO figure out tangent origin + qCDebug(SurveyComplexItemLog) << "Transects from polynom p " << p; _rebuildTranscetsFromPolygon(refly, p, tangentOrigin); } } -void SurveyComplexItem::_PolygonDecomposeConvex(const QPolygonF& polygon, QList& polygons) +void SurveyComplexItem::_PolygonDecomposeConvex(const QPolygonF& polygon, QList& decomposedPolygons) { - polygons << polygon; + qCDebug(SurveyComplexItemLog) << "_PolygonDecomposeConvex polygon.size() " << polygon.size(); + if (polygon.size() < 3) return; + + int decompSize = std::numeric_limits::max(); + QList decomposedPolygonsMin{}; + + for (auto vertex = polygon.begin(); vertex != polygon.end(); ++vertex) + { + // is vertex reflex? + auto vertexBefore = vertex == polygon.begin() ? polygon.end() - 1 : vertex - 1; + auto vertexAfter = vertex == polygon.end() -1 ? polygon.begin() : vertex + 1; + auto area = (((vertex->x() - vertexBefore->x())*(vertexAfter->y() - vertexBefore->y()))-((vertexAfter->x() - vertexBefore->x())*(vertex->y() - vertexBefore->y()))); + bool vertexIsReflex = area > 0; + qCDebug(SurveyComplexItemLog) << "area " << area << " vertexIsReflex " << vertexIsReflex; + + if (!vertexIsReflex) continue; + + for (auto vertexOther = polygon.begin(); vertexOther != polygon.end(); ++vertexOther) + { + if (vertexOther == vertex) continue; + bool canSee = _VertexCanSeeOther(polygon, vertex, vertexOther); + if (!canSee) continue; + + QPolygonF polyLeft; + auto v = vertex; + while ( v != vertexOther) { + polyLeft << *v; + ++v; + if (v == polygon.end()) v = polygon.begin(); + } + polyLeft << *vertexOther; + qCDebug(SurveyComplexItemLog) << "polyLeft.size() " << polyLeft.size(); + + QPolygonF polyRight; + v = vertexOther; + while ( v != vertex) { + polyRight << *v; + ++v; + if (v == polygon.end()) v = polygon.begin(); + } + polyRight << *vertex; + qCDebug(SurveyComplexItemLog) << "polyRight.size() " << polyRight.size(); + + // recursion + QList polyLeftDecomposed{}; + _PolygonDecomposeConvex(polyLeft, polyLeftDecomposed); + QList polyRightDecomposed{}; + _PolygonDecomposeConvex(polyRight, polyRightDecomposed); + + // compositon + if (polyLeftDecomposed.size() + polyRightDecomposed.size() < decompSize) { + decompSize = polyLeftDecomposed.size() + polyRightDecomposed.size(); + decomposedPolygonsMin = polyLeftDecomposed + polyRightDecomposed; + qCDebug(SurveyComplexItemLog) << "changing decomposedPolygonsMin"; + } + else { + qCDebug(SurveyComplexItemLog) << "NOT changing decomposedPolygonsMin"; + } + } + + } + + // assemble output + if (decomposedPolygonsMin.size() > 0) { + qCDebug(SurveyComplexItemLog) << "use decomposed polygon, decomposedPolygonsMin.size() " << decomposedPolygonsMin.size(); + decomposedPolygons << decomposedPolygonsMin; + } else { + qCDebug(SurveyComplexItemLog) << "use default polygon"; + decomposedPolygons << polygon; + } +} + +bool SurveyComplexItem::_VertexCanSeeOther(const QPolygonF& polygon, const QPointF* VertexA, const QPointF* VertexB) { + if (VertexA == VertexB) return false; + if (VertexA + 1 == VertexB) return false; + if (VertexA - 1 == VertexB) return false; + + return true; } void SurveyComplexItem::_rebuildTranscetsFromPolygon(bool refly, const QPolygonF& polygon, const QGeoCoordinate& tangentOrigin) @@ -1301,6 +1379,7 @@ void SurveyComplexItem::_rebuildTranscetsFromPolygon(bool refly, const QPolygonF _transects.append(coordInfoTransect); } + qCDebug(SurveyComplexItemLog) << "_transects.size() " << _transects.size(); } void SurveyComplexItem::_rebuildTransectsPhase2(void) diff --git a/src/MissionManager/SurveyComplexItem.h b/src/MissionManager/SurveyComplexItem.h index 1086a2e7c..f1541fc56 100644 --- a/src/MissionManager/SurveyComplexItem.h +++ b/src/MissionManager/SurveyComplexItem.h @@ -113,7 +113,10 @@ private: void _rebuildTransectsPhase1Worker(bool refly); /// Adds to the _transects array from one polygon void _rebuildTranscetsFromPolygon(bool refly, const QPolygonF& polygon, const QGeoCoordinate& tangentOrigin); - void _PolygonDecomposeConvex(const QPolygonF& polygon, QList& polygons); + // Decompose polygon into list of convex sub polygons + void _PolygonDecomposeConvex(const QPolygonF& polygon, QList& decomposedPolygons); + // return true if vertex a can see vertex b + bool _VertexCanSeeOther(const QPolygonF& polygon, const QPointF* VertexA, const QPointF* VertexB); QMap _metaDataMap; -- 2.22.0