/**************************************************************************** * * (c) 2009-2020 QGROUNDCONTROL PROJECT * * QGroundControl is licensed according to the terms in the file * COPYING.md in the root of the source code directory. * ****************************************************************************/ #include "TrajectoryPoints.h" #include "Vehicle.h" TrajectoryPoints::TrajectoryPoints(Vehicle* vehicle, QObject* parent) : QObject (parent) , _vehicle (vehicle) , _lastAzimuth (qQNaN()) { } void TrajectoryPoints::_vehicleCoordinateChanged(QGeoCoordinate coordinate) { // The goal of this algorithm is to limit the number of trajectory points whic represent the vehicle path. // Fewer points means higher performance of map display. if (_lastPoint.isValid()) { double distance = _lastPoint.distanceTo(coordinate); if (distance > _distanceTolerance) { //-- Update flight distance _vehicle->updateFlightDistance(distance); // Vehicle has moved far enough from previous point for an update double newAzimuth = _lastPoint.azimuthTo(coordinate); if (qIsNaN(_lastAzimuth) || qAbs(newAzimuth - _lastAzimuth) > _azimuthTolerance) { // The new position IS NOT colinear with the last segment. Append the new position to the list. _lastAzimuth = _lastPoint.azimuthTo(coordinate); _lastPoint = coordinate; _points.append(QVariant::fromValue(coordinate)); emit pointAdded(coordinate); } else { // The new position IS colinear with the last segment. Don't add a new point, just update // the last point to be the new position. _lastPoint = coordinate; _points[_points.count() - 1] = QVariant::fromValue(coordinate); emit updateLastPoint(coordinate); } } } else { // Add the very first trajectory point to the list _lastPoint = coordinate; _points.append(QVariant::fromValue(coordinate)); emit pointAdded(coordinate); } } void TrajectoryPoints::start(void) { clear(); connect(_vehicle, &Vehicle::coordinateChanged, this, &TrajectoryPoints::_vehicleCoordinateChanged); } void TrajectoryPoints::stop(void) { disconnect(_vehicle, &Vehicle::coordinateChanged, this, &TrajectoryPoints::_vehicleCoordinateChanged); } void TrajectoryPoints::clear(void) { _points.clear(); _lastPoint = QGeoCoordinate(); _lastAzimuth = qQNaN(); emit pointsCleared(); }