142 lines
3.2 KiB
C++
142 lines
3.2 KiB
C++
/**
|
|
* @file point.h
|
|
* @author Alexander Klein (alex@kleiax.de)
|
|
* @brief
|
|
* @version 0.1
|
|
* @date 2023-09-03
|
|
*
|
|
* @copyright Copyright (c) 2023
|
|
*
|
|
*/
|
|
|
|
#ifndef POINT_H
|
|
#define POINT_H
|
|
|
|
#include <cmath>
|
|
|
|
#define ROUTE_DEGREE_TO_RADIANT 0.01745
|
|
#define ROUTE_DISTANCE_BETWEEN_LATITUDE 111300
|
|
|
|
/**
|
|
* @brief A class to handle points on the earth
|
|
*
|
|
* The points inherits latitude and longitude as doubles
|
|
*
|
|
*/
|
|
class Point
|
|
{
|
|
public:
|
|
/**
|
|
* @brief Hold the data longitude and latitude
|
|
*
|
|
*/
|
|
struct Coordinates
|
|
{
|
|
double lon;
|
|
double lat;
|
|
|
|
bool operator==(const Coordinates rhs) const
|
|
{
|
|
return (this->lon == rhs.lon) && (this->lon == rhs.lon);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* @brief The Accuracy is set by the constructor
|
|
*
|
|
*/
|
|
enum Accuracy
|
|
{
|
|
none,
|
|
fourDigOfCM,
|
|
threeDigOfCM,
|
|
twoDigOfCM,
|
|
oneDigOfCM,
|
|
imported
|
|
};
|
|
|
|
/**
|
|
* @brief Construct a new Point object
|
|
*
|
|
* @param lat
|
|
* @param lon
|
|
* @param horizontalAccuracy
|
|
* @param creationTime
|
|
*/
|
|
Point(double lat, double lon, uint32_t horizontalAccuracy = 0, uint32_t creationTime = 0);
|
|
Point(int32_t lat, int32_t lon, uint32_t horizontalAccuracy = 0, uint32_t creationTime = 0);
|
|
Point(Coordinates coords, uint32_t horizontalAccuracy = 0, uint32_t creationTime = 0);
|
|
Point(Coordinates coords, bool imported);
|
|
Point();
|
|
|
|
/**
|
|
* @brief Checks if to points are equal.
|
|
*
|
|
* @param rhs
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
bool operator==(const Point &rhs) const;
|
|
|
|
/**
|
|
* @brief Checks if the point is initalized.
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
bool isInit() const { return this->coordinates.lat + this->coordinates.lon; }
|
|
|
|
/**
|
|
* @brief Checks if the point is valid.
|
|
*
|
|
* If the accuracy is higher than zero, true will be returned.
|
|
*
|
|
* @return true
|
|
* @return false
|
|
*/
|
|
bool isValid() const { return (this->accuracy > 0) ? true : false; }
|
|
|
|
/**
|
|
* @brief Calculates the distance between to points.
|
|
*
|
|
* @param point
|
|
* @return double meter
|
|
*/
|
|
double distanceTo(const Coordinates &point) const;
|
|
double distanceTo(const Point &point) const;
|
|
|
|
/**
|
|
* @brief Calculates the course to an other point.
|
|
*
|
|
* @param point
|
|
* @return int16_t degree
|
|
*/
|
|
int16_t courseTo(const Coordinates &point) const;
|
|
int16_t courseTo(const Point &point) const;
|
|
|
|
uint32_t getCreationTime() const { return this->creationTime; }
|
|
double getLongitude() const { return this->coordinates.lon; }
|
|
double getLatitude() const { return this->coordinates.lat; }
|
|
Coordinates getCoordinates() const { return this->coordinates; }
|
|
|
|
/**
|
|
* @brief Get the Accuracy object
|
|
*
|
|
* The higher the value, the greater the accuracy.
|
|
* You can check it by Accuracy.
|
|
*
|
|
* @return Accuracy
|
|
*/
|
|
Accuracy getAccuracy() const { return this->accuracy; }
|
|
|
|
private:
|
|
void init(uint32_t horizontalAccuracy, uint32_t creationTime);
|
|
|
|
Accuracy accuracy = Accuracy::none;
|
|
Coordinates coordinates{0, 0};
|
|
|
|
uint32_t creationTime = 0;
|
|
};
|
|
|
|
#endif // POINT_H
|