Commit 2e697315 authored by Don Gagne's avatar Don Gagne

Show tangent flight path visual

parent 6190d361
...@@ -26,6 +26,8 @@ Item { ...@@ -26,6 +26,8 @@ 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
readonly property int _flightPathIndex: 0 readonly property int _flightPathIndex: 0
readonly property int _loiterPointIndex: 1 readonly property int _loiterPointIndex: 1
...@@ -84,6 +86,49 @@ Item { ...@@ -84,6 +86,49 @@ Item {
} }
} }
function radiansToDegrees(radians) {
return radians * (180.0 / Math.PI)
}
function calcPointTangentToCircleWithCenter() {
if (_missionItem.landingCoordSet) {
console.log("recalc")
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: {
if (_missionItem.landingCoordSet) { if (_missionItem.landingCoordSet) {
showItemVisuals() showItemVisuals()
...@@ -93,6 +138,7 @@ Item { ...@@ -93,6 +138,7 @@ Item {
} else if (_missionItem.isCurrentItem) { } else if (_missionItem.isCurrentItem) {
showMouseArea() showMouseArea()
} }
calcPointTangentToCircleWithCenter()
} }
Component.onDestruction: { Component.onDestruction: {
...@@ -126,7 +172,12 @@ Item { ...@@ -126,7 +172,12 @@ Item {
hideDragAreas() hideDragAreas()
showMouseArea() showMouseArea()
} }
calcPointTangentToCircleWithCenter()
} }
onLandingCoordinateChanged: calcPointTangentToCircleWithCenter()
onLoiterCoordinateChanged: calcPointTangentToCircleWithCenter()
onLoiterClockwiseChanged: calcPointTangentToCircleWithCenter()
} }
// Mouse area to capture landing point coordindate // Mouse area to capture landing point coordindate
...@@ -151,10 +202,10 @@ Item { ...@@ -151,10 +202,10 @@ Item {
id: loiterDragAreaComponent id: loiterDragAreaComponent
MissionItemIndicatorDrag { MissionItemIndicatorDrag {
itemIndicator: _itemVisuals[_loiterPointIndex] itemIndicator: _itemVisuals[_loiterPointIndex]
itemCoordinate: _missionItem.loiterCoordinate itemCoordinate: _missionItem.loiterCoordinate
onItemCoordinateChanged: _missionItem.loiterCoordinate = itemCoordinate onItemCoordinateChanged: _missionItem.loiterCoordinate = itemCoordinate
} }
} }
...@@ -163,10 +214,10 @@ Item { ...@@ -163,10 +214,10 @@ Item {
id: landDragAreaComponent id: landDragAreaComponent
MissionItemIndicatorDrag { MissionItemIndicatorDrag {
itemIndicator: _itemVisuals[_landPointIndex] itemIndicator: _itemVisuals[_landPointIndex]
itemCoordinate: _missionItem.landingCoordinate itemCoordinate: _missionItem.landingCoordinate
onItemCoordinateChanged: _missionItem.landingCoordinate = itemCoordinate onItemCoordinateChanged: _missionItem.landingCoordinate = itemCoordinate
} }
} }
...@@ -178,7 +229,7 @@ Item { ...@@ -178,7 +229,7 @@ Item {
z: QGroundControl.zOrderMapItems - 1 // Under item indicators z: QGroundControl.zOrderMapItems - 1 // Under item indicators
line.color: "#be781c" line.color: "#be781c"
line.width: 2 line.width: 2
path: _missionItem.landingCoordSet ? [ _missionItem.loiterCoordinate, _missionItem.landingCoordinate ] : undefined path: _flightPath
} }
} }
......
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