Conquer Space 0.0.0
A space themed grand strategy game set in the near future, with realistic orbital mechanics, and an emphasis on economics and politics.
coordinates.h
Go to the documentation of this file.
1/* Conquer Space
2 * Copyright (C) 2021-2025 Conquer Space
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17#pragma once
18
19#include <math.h>
20
21#include <entt/entt.hpp>
22#include <glm/glm.hpp>
23#include <glm/gtc/quaternion.hpp>
24
27
30struct Kinematics {
31 glm::dvec3 position {0, 0, 0};
32 glm::dvec3 velocity {0, 0, 0};
33 glm::dvec3 center {0, 0, 0};
34};
35
37 glm::dvec3 position {0, 0, 0};
38 glm::dvec3 velocity {0, 0, 0};
39 glm::dvec3 center {0, 0, 0};
41};
42
43// A one tick impulse in the vector
44struct Impulse {
45 glm::dvec3 impulse;
46};
47
54};
55
56template <typename T>
58 T r;
60
61 PolarCoordinate_tp() = default;
62 PolarCoordinate_tp(T _r, degree _theta) : r(_r), theta(_theta) {}
63};
65
66struct MoveTarget {
67 entt::entity target;
68 explicit MoveTarget(entt::entity _targetent) : target(_targetent) {}
69};
70
76 private:
79
80 public:
81 SurfaceCoordinate() = default;
82
89 _lat = normalize_radian_coord(_lat);
91 }
92
95
96 degree latitude() const { return toDegree(_latitude); }
97
98 degree longitude() const { return toDegree(_longitude); }
99
100 radian r_longitude() const { return _longitude; }
101
102 radian r_latitude() const { return _latitude; }
103
105
106 entt::entity planet = entt::null;
107};
108
116
121glm::vec3 toVec3(const SurfaceCoordinate& coord, const float& radius = 1);
122
128inline glm::vec3 toVec3(const PolarCoordinate& coordinate) {
129 return glm::vec3(coordinate.r * cos(toRadian(coordinate.theta)), 0, coordinate.r * sin(toRadian(coordinate.theta)));
130}
131
138double GetLaunchAzimuth(double latitude, double inclination);
139
146double GetLaunchInclination(double latitude, double azimuth);
147
148SurfaceCoordinate ToSurfaceCoordinate(const glm::vec3& vec);
149} // namespace cqsp::core::components::types
Definition: coordinates.cpp:22
constexpr double normalize_radian_coord(const radian &radian)
Definition: units.h:78
constexpr radian toRadian(degree theta)
Definition: units.h:97
constexpr degree toDegree(radian theta)
Definition: units.h:98
double GetLaunchAzimuth(double latitude, double inclination)
Calculates the azimuth of the orbit based on the latitude and inclination
Definition: coordinates.cpp:44
double GreatCircleDistance(SurfaceCoordinate &coord1, SurfaceCoordinate &coord2)
Calculates the angle between the two coordinates. Just multiply by the planet's diameter for fun and ...
Definition: coordinates.cpp:23
SurfaceCoordinate ToSurfaceCoordinate(const glm::vec3 &vec)
Definition: coordinates.cpp:51
glm::vec3 toVec3(const SurfaceCoordinate &coord, const float &radius)
Converts surface coordinate to vector3 in space so that we can get the surface coordinate to render i...
Definition: coordinates.cpp:33
double radian
Definition: units.h:37
double GetLaunchInclination(double latitude, double azimuth)
Calculates the inclination of the orbit based on the latitude and azimuth
Definition: coordinates.cpp:49
PolarCoordinate_tp< types::astronomical_unit > PolarCoordinate
Definition: coordinates.h:64
double degree
Definition: units.h:36
double light_year
Definition: units.h:33
double true_anomaly
Definition: coordinates.h:40
glm::dvec3 center
Definition: coordinates.h:39
glm::dvec3 position
Definition: coordinates.h:37
glm::dvec3 velocity
Definition: coordinates.h:38
Way to position star systems on the universe.
Definition: coordinates.h:51
types::light_year x
Definition: coordinates.h:52
types::light_year y
Definition: coordinates.h:53
Definition: coordinates.h:44
glm::dvec3 impulse
Definition: coordinates.h:45
Relative position from the parent orbiting object.
Definition: coordinates.h:30
glm::dvec3 center
Definition: coordinates.h:33
glm::dvec3 position
Definition: coordinates.h:31
glm::dvec3 velocity
Definition: coordinates.h:32
Definition: coordinates.h:66
entt::entity target
Definition: coordinates.h:67
MoveTarget(entt::entity _targetent)
Definition: coordinates.h:68
PolarCoordinate_tp(T _r, degree _theta)
Definition: coordinates.h:62
degree theta
Definition: coordinates.h:59
Longitude and lattitude. Planet coordinates.
Definition: coordinates.h:75
SurfaceCoordinate universe_view() const
Definition: coordinates.h:104
SurfaceCoordinate(radian _lat, radian _long, bool radian)
Definition: coordinates.h:93
radian r_latitude() const
Definition: coordinates.h:102
SurfaceCoordinate(degree _lat, degree _long)
Creates a surface coordinate
Definition: coordinates.h:88
degree longitude() const
Definition: coordinates.h:98
entt::entity planet
Definition: coordinates.h:106
radian _longitude
Definition: coordinates.h:78
radian _latitude
Definition: coordinates.h:77
degree latitude() const
Definition: coordinates.h:96
radian r_longitude() const
Definition: coordinates.h:100