From 562560779d1c89e451d9fa4a45c014e3b954e953 Mon Sep 17 00:00:00 2001 From: DonLakeFlyer Date: Mon, 11 Nov 2019 17:14:29 -0800 Subject: [PATCH] Fix crash caused by clear method not resetting internals correctly --- src/Vehicle/TrajectoryPoints.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Vehicle/TrajectoryPoints.cc b/src/Vehicle/TrajectoryPoints.cc index 49f6b1f..aa3e719 100644 --- a/src/Vehicle/TrajectoryPoints.cc +++ b/src/Vehicle/TrajectoryPoints.cc @@ -19,22 +19,29 @@ TrajectoryPoints::TrajectoryPoints(Vehicle* vehicle, QObject* parent) 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()) { if (_lastPoint.distanceTo(coordinate) > _distanceTolerance) { + // 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 { - _lastAzimuth = _lastPoint.azimuthTo(coordinate); + // Add the very first trajectory point to the list _lastPoint = coordinate; _points.append(QVariant::fromValue(coordinate)); emit pointAdded(coordinate); @@ -56,5 +63,7 @@ void TrajectoryPoints::stop(void) void TrajectoryPoints::clear(void) { _points.clear(); + _lastPoint = QGeoCoordinate(); + _lastAzimuth = qQNaN(); emit pointsCleared(); }