4#include <QtCore/qmath.h>
14void TrajectoryPoints::_vehicleCoordinateChanged(QGeoCoordinate coordinate)
19 if (_lastPoint.isValid()) {
20 const double horizontalDistance = _lastPoint.distanceTo(coordinate);
21 double altitudeDelta = coordinate.altitude() - _lastPoint.altitude();
22 if (!std::isfinite(altitudeDelta)) {
26 const double distance = std::hypot(horizontalDistance, altitudeDelta);
27 if (distance > _distanceTolerance) {
34 if (horizontalDistance > 0.0) {
35 const double azimuthRad = qDegreesToRadians(_lastPoint.azimuthTo(coordinate));
36 east = std::sin(azimuthRad) * horizontalDistance / distance;
37 north = std::cos(azimuthRad) * horizontalDistance / distance;
39 const QVector3D newDirection(
static_cast<float>(east),
static_cast<float>(north),
40 static_cast<float>(altitudeDelta / distance));
41 static const float colinearDotThreshold =
42 static_cast<float>(std::cos(qDegreesToRadians(_directionTolerance)));
43 if (_lastDirection.isNull() || QVector3D::dotProduct(newDirection, _lastDirection) < colinearDotThreshold) {
45 _lastDirection = newDirection;
46 _lastPoint = coordinate;
47 _points.append(QVariant::fromValue(coordinate));
52 _lastPoint = coordinate;
53 _points[_points.count() - 1] = QVariant::fromValue(coordinate);
59 _lastPoint = coordinate;
60 _points.append(QVariant::fromValue(coordinate));
79 _lastPoint = QGeoCoordinate();
80 _lastDirection = QVector3D();
void pointAdded(QGeoCoordinate coordinate)
void updateLastPoint(QGeoCoordinate coordinate)
TrajectoryPoints(Vehicle *vehicle, QObject *parent=nullptr)
void coordinateChanged(QGeoCoordinate coordinate)
void updateFlightDistance(double distance)