/** * @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 #define ROUTE_DEGREE_TO_RADIANT 0.01745 #define ROUTE_DISTANCE_BETWEEN_LATITUDE 111300 /** * @brief A to handle points on the earth * * The points inherits latidue 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 latitude * @param lon longitude * @param horizontalAccuracy mm * @param coords Coordinates * @param imported if true than highest accuracy */ 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; uint32_t creationTime = 0; }; #endif //POINT_H