Unverified Commit 84a6c9d9 authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #6962 from mavlink/feature/concave_poly

Feature: Concave Polygon Support by Splitting into Sub-Polygons
parents da8e98a1 a2a82f30
...@@ -13,6 +13,7 @@ Note: This file only contains high level features or important fixes. ...@@ -13,6 +13,7 @@ Note: This file only contains high level features or important fixes.
* Make Heading to Home available for display from instrument panel. * Make Heading to Home available for display from instrument panel.
* Edit Position dialog available on polygon vertices. * Edit Position dialog available on polygon vertices.
* Fixed Wing Landing Pattern: Add stop photo/video support. Defaults to on such that doing an RTL will stop camera. * Fixed Wing Landing Pattern: Add stop photo/video support. Defaults to on such that doing an RTL will stop camera.
* Survey Planning: add mode that supports concave polygons
## 3.4 ## 3.4
......
...@@ -14,5 +14,11 @@ ...@@ -14,5 +14,11 @@
"shortDescription": "Fly every other transect in each pass.", "shortDescription": "Fly every other transect in each pass.",
"type": "bool", "type": "bool",
"defaultValue": false "defaultValue": false
},
{
"name": "SplitConcavePolygons",
"shortDescription": "Split mission concave polygons into separate regular, convex polygons.",
"type": "bool",
"defaultValue": true
} }
] ]
This diff is collapsed.
...@@ -28,9 +28,11 @@ public: ...@@ -28,9 +28,11 @@ public:
Q_PROPERTY(Fact* gridAngle READ gridAngle CONSTANT) Q_PROPERTY(Fact* gridAngle READ gridAngle CONSTANT)
Q_PROPERTY(Fact* flyAlternateTransects READ flyAlternateTransects CONSTANT) Q_PROPERTY(Fact* flyAlternateTransects READ flyAlternateTransects CONSTANT)
Q_PROPERTY(Fact* splitConcavePolygons READ splitConcavePolygons CONSTANT)
Fact* gridAngle (void) { return &_gridAngleFact; } Fact* gridAngle (void) { return &_gridAngleFact; }
Fact* flyAlternateTransects (void) { return &_flyAlternateTransectsFact; } Fact* flyAlternateTransects (void) { return &_flyAlternateTransectsFact; }
Fact* splitConcavePolygons (void) { return &_splitConcavePolygonsFact; }
Q_INVOKABLE void rotateEntryPoint(void); Q_INVOKABLE void rotateEntryPoint(void);
...@@ -66,6 +68,7 @@ public: ...@@ -66,6 +68,7 @@ public:
static const char* gridAngleName; static const char* gridAngleName;
static const char* gridEntryLocationName; static const char* gridEntryLocationName;
static const char* flyAlternateTransectsName; static const char* flyAlternateTransectsName;
static const char* splitConcavePolygonsName;
static const char* jsonV3ComplexItemTypeValue; static const char* jsonV3ComplexItemTypeValue;
...@@ -109,18 +112,29 @@ private: ...@@ -109,18 +112,29 @@ private:
double _turnaroundDistance(void) const; double _turnaroundDistance(void) const;
bool _hoverAndCaptureEnabled(void) const; bool _hoverAndCaptureEnabled(void) const;
bool _loadV3(const QJsonObject& complexObject, int sequenceNumber, QString& errorString); bool _loadV3(const QJsonObject& complexObject, int sequenceNumber, QString& errorString);
bool _loadV4(const QJsonObject& complexObject, int sequenceNumber, QString& errorString); bool _loadV4V5(const QJsonObject& complexObject, int sequenceNumber, QString& errorString, int version);
void _rebuildTransectsPhase1Worker(bool refly); void _rebuildTransectsPhase1Worker(bool refly);
void _rebuildTransectsPhase1WorkerSinglePolygon(bool refly);
void _rebuildTransectsPhase1WorkerSplitPolygons(bool refly);
/// Adds to the _transects array from one polygon
void _rebuildTranscetsFromPolygon(bool refly, const QPolygonF& polygon, const QGeoCoordinate& tangentOrigin, const QPointF* const transitionPoint);
// Decompose polygon into list of convex sub polygons
void _PolygonDecomposeConvex(const QPolygonF& polygon, QList<QPolygonF>& decomposedPolygons);
// return true if vertex a can see vertex b
bool _VertexCanSeeOther(const QPolygonF& polygon, const QPointF* vertexA, const QPointF* vertexB);
bool _VertexIsReflex(const QPolygonF& polygon, const QPointF* vertex);
QMap<QString, FactMetaData*> _metaDataMap; QMap<QString, FactMetaData*> _metaDataMap;
SettingsFact _gridAngleFact; SettingsFact _gridAngleFact;
SettingsFact _flyAlternateTransectsFact; SettingsFact _flyAlternateTransectsFact;
SettingsFact _splitConcavePolygonsFact;
int _entryPoint; int _entryPoint;
static const char* _jsonGridAngleKey; static const char* _jsonGridAngleKey;
static const char* _jsonEntryPointKey; static const char* _jsonEntryPointKey;
static const char* _jsonFlyAlternateTransectsKey; static const char* _jsonFlyAlternateTransectsKey;
static const char* _jsonSplitConcavePolygonsKey;
static const char* _jsonV3GridObjectKey; static const char* _jsonV3GridObjectKey;
static const char* _jsonV3GridAltitudeKey; static const char* _jsonV3GridAltitudeKey;
......
...@@ -9,6 +9,7 @@ import QGroundControl 1.0 ...@@ -9,6 +9,7 @@ import QGroundControl 1.0
import QGroundControl.ScreenTools 1.0 import QGroundControl.ScreenTools 1.0
import QGroundControl.Vehicle 1.0 import QGroundControl.Vehicle 1.0
import QGroundControl.Controls 1.0 import QGroundControl.Controls 1.0
import QGroundControl.FactSystem 1.0
import QGroundControl.FactControls 1.0 import QGroundControl.FactControls 1.0
import QGroundControl.Palette 1.0 import QGroundControl.Palette 1.0
import QGroundControl.FlightMap 1.0 import QGroundControl.FlightMap 1.0
...@@ -119,6 +120,13 @@ Rectangle { ...@@ -119,6 +120,13 @@ Rectangle {
onClicked: missionItem.rotateEntryPoint(); onClicked: missionItem.rotateEntryPoint();
} }
FactCheckBox {
text: qsTr("Split concave polygons")
fact: _splitConcave
visible: _splitConcave.visible
property Fact _splitConcave: missionItem.splitConcavePolygons
}
FactCheckBox { FactCheckBox {
text: qsTr("Hover and capture image") text: qsTr("Hover and capture image")
fact: missionItem.hoverAndCapture fact: missionItem.hoverAndCapture
......
...@@ -61,29 +61,29 @@ const char* AppSettings::crashDirectory = "CrashLogs"; ...@@ -61,29 +61,29 @@ const char* AppSettings::crashDirectory = "CrashLogs";
AppSettings::AppSettings(QObject* parent) AppSettings::AppSettings(QObject* parent)
: SettingsGroup (name, settingsGroup, parent) : SettingsGroup (name, settingsGroup, parent)
, _offlineEditingFirmwareTypeFact (NULL) , _offlineEditingFirmwareTypeFact (nullptr)
, _offlineEditingVehicleTypeFact (NULL) , _offlineEditingVehicleTypeFact (nullptr)
, _offlineEditingCruiseSpeedFact (NULL) , _offlineEditingCruiseSpeedFact (nullptr)
, _offlineEditingHoverSpeedFact (NULL) , _offlineEditingHoverSpeedFact (nullptr)
, _offlineEditingAscentSpeedFact (NULL) , _offlineEditingAscentSpeedFact (nullptr)
, _offlineEditingDescentSpeedFact (NULL) , _offlineEditingDescentSpeedFact (nullptr)
, _batteryPercentRemainingAnnounceFact (NULL) , _batteryPercentRemainingAnnounceFact (nullptr)
, _defaultMissionItemAltitudeFact (NULL) , _defaultMissionItemAltitudeFact (nullptr)
, _telemetrySaveFact (NULL) , _telemetrySaveFact (nullptr)
, _telemetrySaveNotArmedFact (NULL) , _telemetrySaveNotArmedFact (nullptr)
, _audioMutedFact (NULL) , _audioMutedFact (nullptr)
, _virtualJoystickFact (NULL) , _virtualJoystickFact (nullptr)
, _appFontPointSizeFact (NULL) , _appFontPointSizeFact (nullptr)
, _indoorPaletteFact (NULL) , _indoorPaletteFact (nullptr)
, _showLargeCompassFact (NULL) , _showLargeCompassFact (nullptr)
, _savePathFact (NULL) , _savePathFact (nullptr)
, _autoLoadMissionsFact (NULL) , _autoLoadMissionsFact (nullptr)
, _useChecklistFact (NULL) , _useChecklistFact (nullptr)
, _mapboxTokenFact (NULL) , _mapboxTokenFact (nullptr)
, _esriTokenFact (NULL) , _esriTokenFact (nullptr)
, _defaultFirmwareTypeFact (NULL) , _defaultFirmwareTypeFact (nullptr)
, _gstDebugFact (NULL) , _gstDebugFact (nullptr)
, _followTargetFact (NULL) , _followTargetFact (nullptr)
{ {
QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
qmlRegisterUncreatableType<AppSettings>("QGroundControl.SettingsManager", 1, 0, "AppSettings", "Reference only"); qmlRegisterUncreatableType<AppSettings>("QGroundControl.SettingsManager", 1, 0, "AppSettings", "Reference only");
...@@ -427,4 +427,3 @@ Fact* AppSettings::followTarget(void) ...@@ -427,4 +427,3 @@ Fact* AppSettings::followTarget(void)
return _followTargetFact; return _followTargetFact;
} }
...@@ -18,7 +18,7 @@ class AppSettings : public SettingsGroup ...@@ -18,7 +18,7 @@ class AppSettings : public SettingsGroup
Q_OBJECT Q_OBJECT
public: public:
AppSettings(QObject* parent = NULL); AppSettings(QObject* parent = nullptr);
Q_PROPERTY(Fact* offlineEditingFirmwareType READ offlineEditingFirmwareType CONSTANT) Q_PROPERTY(Fact* offlineEditingFirmwareType READ offlineEditingFirmwareType CONSTANT)
Q_PROPERTY(Fact* offlineEditingVehicleType READ offlineEditingVehicleType CONSTANT) Q_PROPERTY(Fact* offlineEditingVehicleType READ offlineEditingVehicleType CONSTANT)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment