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.
units.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 <cmath>
20
23 Distance, // Default distance: kilometer
24 Angle, // Default distance: degree
25 Mass, // Default distance: kilogram
26 Volume, // Default distance: m^3
27 Time, // Default distance: second
28 Power // Default value: Watt (maybe next time we do megawatts or somethign)
29};
30
32
33typedef double astronomical_unit;
34typedef double light_year;
35typedef double kilometer;
36typedef double solar_mass;
37typedef double degree;
38typedef double radian;
39typedef double meter_cube;
40typedef double kilogram;
41typedef double earth_masses;
42typedef double joule;
43typedef double second;
44
45// Constants
46constexpr double PI = 3.14159265358979323846;
47constexpr double TWOPI = PI * 2;
48constexpr double HALFPI = PI / 2;
49
50constexpr double KmInAu = 149597870.700;
51
52// Gravitional constant in m^3 * kg^-1 * s^-2
53constexpr double G = 6.6743015e-11;
54// Gravitional constant in km^3 * kg^-1 * s^-2
55constexpr double G_km = 6.6743015e-20;
56
57// GM of sun/sun gravitational constant in km^3 * s^-2
58constexpr double SunMu = 1.32712400188e11;
59
60#if __cplusplus == 202302L
61// Then use fmod
62#define floatmod std::fmod
63#else
64inline double constexpr floatmod(double x, double y) { return x - y * (int)(x / y); }
65#endif
66
71inline constexpr radian normalize_radian(const radian& radian) {
72 double x = floatmod(radian, TWOPI);
73 if (x < 0) {
74 x += TWOPI;
75 }
76 return x;
77}
78
79inline constexpr double normalize_radian_coord(const radian& radian) {
80 double r = floatmod(radian + PI, TWOPI);
81 if (r < 0) r += TWOPI;
82 return r - PI;
83}
84
85inline constexpr degree normalize_degree(const degree& radian) {
86 double x = floatmod(radian, 360);
87 if (x < 0) {
88 x += 360;
89 }
90 return x;
91}
92
93// Conversions
94inline constexpr astronomical_unit toAU(kilometer km) { return km / KmInAu; }
95inline constexpr light_year toLightYear(astronomical_unit au) { return au / 63241; }
96inline constexpr astronomical_unit LtyrtoAU(light_year ltyr) { return ltyr * 63241; }
97inline constexpr kilometer toKm(astronomical_unit au) { return au * KmInAu; }
98inline constexpr radian toRadian(degree theta) { return theta * (PI / 180.f); }
99inline constexpr degree toDegree(radian theta) { return theta * (180.f / PI); }
100
101inline constexpr double operator""_deg(const long double deg) { return normalize_radian(toRadian(deg)); }
102inline constexpr double operator""_au(const long double au) { return toKm(au); }
103#ifdef floatmod
104#undef floatmod
105#endif // floatmod
106} // namespace cqsp::core::components::types
Definition: coordinates.cpp:22
constexpr double normalize_radian_coord(const radian &radian)
Definition: units.h:79
constexpr astronomical_unit toAU(kilometer km)
Definition: units.h:94
constexpr radian toRadian(degree theta)
Definition: units.h:98
constexpr double G
Definition: units.h:53
constexpr radian normalize_radian(const radian &radian)
Normalizes a radian to [0, PI*2)
Definition: units.h:71
constexpr degree toDegree(radian theta)
Definition: units.h:99
constexpr light_year toLightYear(astronomical_unit au)
Definition: units.h:95
constexpr degree normalize_degree(const degree &radian)
Definition: units.h:85
constexpr double G_km
Definition: units.h:55
double second
Definition: units.h:43
constexpr astronomical_unit LtyrtoAU(light_year ltyr)
Definition: units.h:96
double astronomical_unit
Definition: units.h:33
UnitType
Definition: units.h:22
@ Angle
Definition: units.h:24
@ Power
Definition: units.h:28
@ Time
Definition: units.h:27
@ Mass
Definition: units.h:25
@ Volume
Definition: units.h:26
Distance
Definition: units.h:31
@ Kilometer
Definition: units.h:31
@ Millimeter
Definition: units.h:31
@ Centimeter
Definition: units.h:31
@ Meter
Definition: units.h:31
@ LightYear
Definition: units.h:31
@ AstronomicalUnit
Definition: units.h:31
constexpr kilometer toKm(astronomical_unit au)
Definition: units.h:97
constexpr double floatmod(double x, double y)
Definition: units.h:64
double solar_mass
Definition: units.h:36
double radian
Definition: units.h:38
double meter_cube
Definition: units.h:39
constexpr double HALFPI
Definition: units.h:48
constexpr double PI
Definition: units.h:46
double kilogram
Definition: units.h:40
double joule
Definition: units.h:42
constexpr double TWOPI
Definition: units.h:47
constexpr double SunMu
Definition: units.h:58
double earth_masses
Definition: units.h:41
constexpr double KmInAu
Definition: units.h:50
double degree
Definition: units.h:37
double light_year
Definition: units.h:34
double kilometer
Definition: units.h:35