Commit b7da6015 authored by Don Gagne's avatar Don Gagne Committed by GitHub

Merge pull request #4770 from DonLakeFlyer/FWGeometry

More fun with FW landing pattern geometry
parents 72573e85 c2280df3
...@@ -26,7 +26,6 @@ Item { ...@@ -26,7 +26,6 @@ Item {
property var _itemVisuals: [ ] property var _itemVisuals: [ ]
property var _mouseArea property var _mouseArea
property var _dragAreas: [ ] property var _dragAreas: [ ]
property var _loiterTangentCoordinate
property var _flightPath property var _flightPath
readonly property int _flightPathIndex: 0 readonly property int _flightPathIndex: 0
...@@ -86,46 +85,8 @@ Item { ...@@ -86,46 +85,8 @@ Item {
} }
} }
function radiansToDegrees(radians) { function _setFlightPath() {
return radians * (180.0 / Math.PI) _flightPath = [ _missionItem.loiterTangentCoordinate, _missionItem.landingCoordinate ]
}
function calcPointTangentToCircleWithCenter() {
if (_missionItem.landingCoordSet) {
var radius = _missionItem.loiterRadius.value
var loiterPointPixels = map.fromCoordinate(_missionItem.loiterCoordinate, false /* clipToViewport */)
var landPointPixels = map.fromCoordinate(_missionItem.landingCoordinate, false /* clipToViewport */)
var dxHypotenuse = loiterPointPixels.x - landPointPixels.x
var dyHypotenuse = loiterPointPixels.y - landPointPixels.y
var oppositeLength = radius
var hypotenuseLength = _missionItem.landingCoordinate.distanceTo(_missionItem.loiterCoordinate)
var adjacentLength = Math.sqrt(Math.pow(hypotenuseLength, 2) - Math.pow(oppositeLength, 2))
var angleToCenterRadians = -Math.atan2(dyHypotenuse, dxHypotenuse)
var angleCenterToTangentRadians = Math.asin(oppositeLength / hypotenuseLength)
var angleToTangentRadians
if (_missionItem.loiterClockwise) {
angleToTangentRadians = angleToCenterRadians - angleCenterToTangentRadians
} else {
angleToTangentRadians = angleToCenterRadians + angleCenterToTangentRadians
}
var angleToTangentDegrees = (radiansToDegrees(angleToTangentRadians) - 90) * -1
/*
Keep in for debugging for now
console.log("dxHypotenuse", dxHypotenuse)
console.log("dyHypotenuse", dyHypotenuse)
console.log("oppositeLength", oppositeLength)
console.log("hypotenuseLength", hypotenuseLength)
console.log("adjacentLength", adjacentLength)
console.log("angleCenterToTangentRadians", angleCenterToTangentRadians, radiansToDegrees(angleCenterToTangentRadians))
console.log("angleToCenterRadians", angleToCenterRadians, radiansToDegrees(angleToCenterRadians))
console.log("angleToTangentDegrees", angleToTangentDegrees)
*/
_loiterTangentCoordinate = _missionItem.landingCoordinate.atDistanceAndAzimuth(adjacentLength, angleToTangentDegrees)
_flightPath = [ _loiterTangentCoordinate, _missionItem.landingCoordinate ]
} else {
_flightPath = undefined
}
} }
Component.onCompleted: { Component.onCompleted: {
...@@ -134,10 +95,10 @@ Item { ...@@ -134,10 +95,10 @@ Item {
if (_missionItem.isCurrentItem) { if (_missionItem.isCurrentItem) {
showDragAreas() showDragAreas()
} }
_setFlightPath()
} else if (_missionItem.isCurrentItem) { } else if (_missionItem.isCurrentItem) {
showMouseArea() showMouseArea()
} }
calcPointTangentToCircleWithCenter()
} }
Component.onDestruction: { Component.onDestruction: {
...@@ -167,16 +128,15 @@ Item { ...@@ -167,16 +128,15 @@ Item {
hideMouseArea() hideMouseArea()
showItemVisuals() showItemVisuals()
showDragAreas() showDragAreas()
_setFlightPath()
} else if (_missionItem.isCurrentItem) { } else if (_missionItem.isCurrentItem) {
hideDragAreas() hideDragAreas()
showMouseArea() showMouseArea()
} }
calcPointTangentToCircleWithCenter()
} }
onLandingCoordinateChanged: calcPointTangentToCircleWithCenter() onLandingCoordinateChanged: _setFlightPath()
onLoiterCoordinateChanged: calcPointTangentToCircleWithCenter() onLoiterTangentCoordinateChanged: _setFlightPath()
onLoiterClockwiseChanged: calcPointTangentToCircleWithCenter()
} }
// Mouse area to capture landing point coordindate // Mouse area to capture landing point coordindate
......
...@@ -24,28 +24,30 @@ class FixedWingLandingComplexItem : public ComplexMissionItem ...@@ -24,28 +24,30 @@ class FixedWingLandingComplexItem : public ComplexMissionItem
public: public:
FixedWingLandingComplexItem(Vehicle* vehicle, QObject* parent = NULL); FixedWingLandingComplexItem(Vehicle* vehicle, QObject* parent = NULL);
Q_PROPERTY(Fact* loiterAltitude READ loiterAltitude CONSTANT) Q_PROPERTY(Fact* loiterAltitude READ loiterAltitude CONSTANT)
Q_PROPERTY(Fact* loiterRadius READ loiterRadius CONSTANT) Q_PROPERTY(Fact* loiterRadius READ loiterRadius CONSTANT)
Q_PROPERTY(Fact* landingAltitude READ landingAltitude CONSTANT) Q_PROPERTY(Fact* landingAltitude READ landingAltitude CONSTANT)
Q_PROPERTY(Fact* landingDistance READ landingDistance CONSTANT) Q_PROPERTY(Fact* landingDistance READ landingDistance CONSTANT)
Q_PROPERTY(Fact* landingHeading READ landingHeading CONSTANT) Q_PROPERTY(Fact* landingHeading READ landingHeading CONSTANT)
Q_PROPERTY(bool loiterClockwise MEMBER _loiterClockwise NOTIFY loiterClockwiseChanged) Q_PROPERTY(bool loiterClockwise MEMBER _loiterClockwise NOTIFY loiterClockwiseChanged)
Q_PROPERTY(bool loiterAltitudeRelative MEMBER _loiterAltitudeRelative NOTIFY loiterAltitudeRelativeChanged) Q_PROPERTY(bool loiterAltitudeRelative MEMBER _loiterAltitudeRelative NOTIFY loiterAltitudeRelativeChanged)
Q_PROPERTY(bool landingAltitudeRelative MEMBER _landingAltitudeRelative NOTIFY landingAltitudeRelativeChanged) Q_PROPERTY(bool landingAltitudeRelative MEMBER _landingAltitudeRelative NOTIFY landingAltitudeRelativeChanged)
Q_PROPERTY(QGeoCoordinate loiterCoordinate READ loiterCoordinate WRITE setLoiterCoordinate NOTIFY loiterCoordinateChanged) Q_PROPERTY(QGeoCoordinate loiterCoordinate READ loiterCoordinate WRITE setLoiterCoordinate NOTIFY loiterCoordinateChanged)
Q_PROPERTY(QGeoCoordinate landingCoordinate READ landingCoordinate WRITE setLandingCoordinate NOTIFY landingCoordinateChanged) Q_PROPERTY(QGeoCoordinate loiterTangentCoordinate READ loiterTangentCoordinate NOTIFY loiterTangentCoordinateChanged)
Q_PROPERTY(bool landingCoordSet MEMBER _landingCoordSet NOTIFY landingCoordSetChanged) Q_PROPERTY(QGeoCoordinate landingCoordinate READ landingCoordinate WRITE setLandingCoordinate NOTIFY landingCoordinateChanged)
Q_PROPERTY(bool landingCoordSet MEMBER _landingCoordSet NOTIFY landingCoordSetChanged)
Fact* loiterAltitude (void) { return &_loiterAltitudeFact; }
Fact* loiterRadius (void) { return &_loiterRadiusFact; } Fact* loiterAltitude (void) { return &_loiterAltitudeFact; }
Fact* landingAltitude (void) { return &_landingAltitudeFact; } Fact* loiterRadius (void) { return &_loiterRadiusFact; }
Fact* landingDistance (void) { return &_loiterToLandDistanceFact; } Fact* landingAltitude (void) { return &_landingAltitudeFact; }
Fact* landingHeading (void) { return &_landingHeadingFact; } Fact* landingDistance (void) { return &_landingDistanceFact; }
QGeoCoordinate landingCoordinate (void) const { return _landingCoordinate; } Fact* landingHeading (void) { return &_landingHeadingFact; }
QGeoCoordinate loiterCoordinate (void) const { return _loiterCoordinate; } QGeoCoordinate landingCoordinate (void) const { return _landingCoordinate; }
QGeoCoordinate loiterCoordinate (void) const { return _loiterCoordinate; }
void setLandingCoordinate (const QGeoCoordinate& coordinate); QGeoCoordinate loiterTangentCoordinate (void) const { return _loiterTangentCoordinate; }
void setLoiterCoordinate (const QGeoCoordinate& coordinate);
void setLandingCoordinate (const QGeoCoordinate& coordinate);
void setLoiterCoordinate (const QGeoCoordinate& coordinate);
// Overrides from ComplexMissionItem // Overrides from ComplexMissionItem
...@@ -84,6 +86,7 @@ public: ...@@ -84,6 +86,7 @@ public:
signals: signals:
void loiterCoordinateChanged (QGeoCoordinate coordinate); void loiterCoordinateChanged (QGeoCoordinate coordinate);
void loiterTangentCoordinateChanged (QGeoCoordinate coordinate);
void landingCoordinateChanged (QGeoCoordinate coordinate); void landingCoordinateChanged (QGeoCoordinate coordinate);
void landingCoordSetChanged (bool landingCoordSet); void landingCoordSetChanged (bool landingCoordSet);
void loiterClockwiseChanged (bool loiterClockwise); void loiterClockwiseChanged (bool loiterClockwise);
...@@ -91,10 +94,13 @@ signals: ...@@ -91,10 +94,13 @@ signals:
void landingAltitudeRelativeChanged (bool loiterAltitudeRelative); void landingAltitudeRelativeChanged (bool loiterAltitudeRelative);
private slots: private slots:
void _recalcLoiterCoordFromFacts(void); void _recalcFromHeadingAndDistanceChange(void);
void _recalcFactsFromCoords(void); void _recalcFromCoordinateChange(void);
void _recalcFromRadiusChange(void);
void _updateLoiterCoodinateAltitudeFromFact(void); void _updateLoiterCoodinateAltitudeFromFact(void);
void _updateLandingCoodinateAltitudeFromFact(void); void _updateLandingCoodinateAltitudeFromFact(void);
double _mathematicAngleToHeading(double angle);
double _headingToMathematicAngle(double heading);
private: private:
QPointF _rotatePoint(const QPointF& point, const QPointF& origin, double angle); QPointF _rotatePoint(const QPointF& point, const QPointF& origin, double angle);
...@@ -102,11 +108,12 @@ private: ...@@ -102,11 +108,12 @@ private:
int _sequenceNumber; int _sequenceNumber;
bool _dirty; bool _dirty;
QGeoCoordinate _loiterCoordinate; QGeoCoordinate _loiterCoordinate;
QGeoCoordinate _loiterTangentCoordinate;
QGeoCoordinate _landingCoordinate; QGeoCoordinate _landingCoordinate;
bool _landingCoordSet; bool _landingCoordSet;
bool _ignoreRecalcSignals; bool _ignoreRecalcSignals;
Fact _loiterToLandDistanceFact; Fact _landingDistanceFact;
Fact _loiterAltitudeFact; Fact _loiterAltitudeFact;
Fact _loiterRadiusFact; Fact _loiterRadiusFact;
Fact _landingHeadingFact; Fact _landingHeadingFact;
......
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