Difference between revisions of "User:TomPN"
From Kerbal Space Program Wiki
Line 1: | Line 1: | ||
− | Hi! I'm TomPN, and I'm an avid fan of Kerbal Space Program. I'd like to upload my program for calculating whether you should use a Hohmann transfer or a Bi-elliptical transfer, but it's an exe so I can't. I can post the source code, however, so here goes (You'll need a C++ emulator (can be found online) or compiler (can be downloaded) to run the code): | + | Hi! I'm TomPN, and I'm an avid fan of Kerbal Space Program. I'd like to upload my (now upgraded) program for calculating whether you should use a Hohmann transfer or a Bi-elliptical transfer, but it's an exe so I can't. I can post the source code, however, so here goes (You'll need a C++ emulator (can be found online) or compiler (can be downloaded) to run the code): |
#include <math.h> | #include <math.h> | ||
Line 7: | Line 7: | ||
using namespace std; | using namespace std; | ||
− | double | + | void bi_elliptical_delta_v (double current_orbit, double bi_elliptical_apoapsis, double final_orbit, double standard_gravitational_parameter, double planet_radius) |
{ | { | ||
− | double | + | double delta_v_1, delta_v_2, delta_v_3, delta_v_total; |
− | + | delta_v_1 = sqrt (((2*standard_gravitational_parameter)/current_orbit)-((2*standard_gravitational_parameter)/(current_orbit + bi_elliptical_apoapsis))) - sqrt (standard_gravitational_parameter/current_orbit); | |
− | + | delta_v_2 = sqrt (((2*standard_gravitational_parameter)/bi_elliptical_apoapsis)-((2*standard_gravitational_parameter)/(final_orbit + bi_elliptical_apoapsis))) - sqrt (((2*standard_gravitational_parameter)/bi_elliptical_apoapsis)-((2*standard_gravitational_parameter)/(current_orbit + bi_elliptical_apoapsis))); | |
− | + | delta_v_3 = sqrt (((2*standard_gravitational_parameter)/final_orbit)-((2*standard_gravitational_parameter)/(final_orbit + bi_elliptical_apoapsis))) - sqrt (standard_gravitational_parameter/final_orbit); | |
− | + | delta_v_total = delta_v_1 + delta_v_2 + delta_v_3; | |
− | + | string fore; | |
+ | if (current_orbit < final_orbit) | ||
+ | { | ||
+ | fore = "prograde"; | ||
+ | } | ||
+ | else if (current_orbit > final_orbit) | ||
+ | { | ||
+ | fore = "retrograde"; | ||
+ | } | ||
+ | cout << "Bi-elliptcal transfer stats:" << endl << "Bi-elliptical apoapsis: " << bi_elliptical_apoapsis - planet_radius << "m above sea level" << endl << "Burn 1 = " << delta_v_1 << "m/s prograde" << endl << "Burn 2: " << delta_v_2 << "m/s " << fore << endl << "Burn 3 = " << delta_v_3 << "m/s retrograde" << endl << "Total delta v: " << delta_v_total << "m/s" << endl; | ||
+ | } | ||
+ | |||
+ | void hohmann_delta_v (double current_orbit, double final_orbit, double standard_gravitational_parameter) | ||
+ | { | ||
+ | double delta_v_1, delta_v_2, delta_v_total; | ||
+ | delta_v_1 = sqrt (((2*standard_gravitational_parameter)/current_orbit)-((2*standard_gravitational_parameter)/(current_orbit + final_orbit))) - sqrt (standard_gravitational_parameter/current_orbit); | ||
+ | delta_v_2 = sqrt (((standard_gravitational_parameter)/final_orbit)) - sqrt (((2*standard_gravitational_parameter)/final_orbit)-((2*standard_gravitational_parameter)/(current_orbit + final_orbit))); | ||
+ | delta_v_total = delta_v_1 + delta_v_2; | ||
+ | string fore; | ||
+ | if (current_orbit < final_orbit) | ||
+ | { | ||
+ | fore = "prograde"; | ||
+ | } | ||
+ | else if (current_orbit > final_orbit) | ||
+ | { | ||
+ | fore = "retrograde"; | ||
+ | } | ||
+ | cout << "Hohmann transfer stats:" << endl << "Burn 1 = " << delta_v_1 << "m/s " << fore << endl << "Burn 2: " << delta_v_2 << "m/s " << fore << endl << "Total delta v: " << delta_v_total << "m/s" << endl; | ||
} | } | ||
int main () | int main () | ||
{ | { | ||
− | cout << "Orbital transfer calculator | + | cout << "Orbital transfer calculator v2.0\nWritten by TomPN\n18/01/2016\n" << endl; |
double planet_mass; | double planet_mass; | ||
cout << "Please enter the mass of the body you are in orbit around (in kilograms x10^20): "; | cout << "Please enter the mass of the body you are in orbit around (in kilograms x10^20): "; | ||
Line 25: | Line 52: | ||
double mass_multiplier = 100000000000000000000.0; | double mass_multiplier = 100000000000000000000.0; | ||
planet_mass *= mass_multiplier; | planet_mass *= mass_multiplier; | ||
+ | double standard_gravitational_parameter = planet_mass*0.0000000000667; | ||
+ | double planet_radius; | ||
+ | cout << "Please enter the radius of the body you are in orbit around (in metres): "; | ||
+ | cin >> planet_radius; | ||
double current_orbit; | double current_orbit; | ||
− | cout << "Please enter your current orbital | + | cout << "Please enter your current orbital altitude above sea level (in metres): "; |
cin >> current_orbit; | cin >> current_orbit; | ||
+ | current_orbit += planet_radius; | ||
double final_orbit; | double final_orbit; | ||
− | cout << "Please enter your desired orbital | + | cout << "Please enter your desired orbital altitude above sea level (in metres): "; |
cin >> final_orbit; | cin >> final_orbit; | ||
+ | final_orbit += planet_radius; | ||
double sphere_of_influence; | double sphere_of_influence; | ||
cout << "Please enter the radius of the sphere of influence of the body that you are\n currently in orbit around (in metres): "; | cout << "Please enter the radius of the sphere of influence of the body that you are\n currently in orbit around (in metres): "; | ||
cin >> sphere_of_influence; | cin >> sphere_of_influence; | ||
− | + | cout << endl; | |
− | double bi_elliptical_apoapsis = | + | double bi_elliptical_apoapsis = (0.9*(sphere_of_influence - final_orbit)) + final_orbit; |
− | + | hohmann_delta_v (current_orbit, final_orbit, standard_gravitational_parameter); | |
− | + | cout << endl; | |
− | + | bi_elliptical_delta_v (current_orbit, bi_elliptical_apoapsis, final_orbit, standard_gravitational_parameter, planet_radius); | |
− | + | cout << endl; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
system ("PAUSE"); | system ("PAUSE"); | ||
return 0; | return 0; |
Revision as of 13:14, 18 January 2016
Hi! I'm TomPN, and I'm an avid fan of Kerbal Space Program. I'd like to upload my (now upgraded) program for calculating whether you should use a Hohmann transfer or a Bi-elliptical transfer, but it's an exe so I can't. I can post the source code, however, so here goes (You'll need a C++ emulator (can be found online) or compiler (can be downloaded) to run the code):
#include <math.h> #include <iostream> #include <cstdlib> using namespace std; void bi_elliptical_delta_v (double current_orbit, double bi_elliptical_apoapsis, double final_orbit, double standard_gravitational_parameter, double planet_radius) { double delta_v_1, delta_v_2, delta_v_3, delta_v_total; delta_v_1 = sqrt (((2*standard_gravitational_parameter)/current_orbit)-((2*standard_gravitational_parameter)/(current_orbit + bi_elliptical_apoapsis))) - sqrt (standard_gravitational_parameter/current_orbit); delta_v_2 = sqrt (((2*standard_gravitational_parameter)/bi_elliptical_apoapsis)-((2*standard_gravitational_parameter)/(final_orbit + bi_elliptical_apoapsis))) - sqrt (((2*standard_gravitational_parameter)/bi_elliptical_apoapsis)-((2*standard_gravitational_parameter)/(current_orbit + bi_elliptical_apoapsis))); delta_v_3 = sqrt (((2*standard_gravitational_parameter)/final_orbit)-((2*standard_gravitational_parameter)/(final_orbit + bi_elliptical_apoapsis))) - sqrt (standard_gravitational_parameter/final_orbit); delta_v_total = delta_v_1 + delta_v_2 + delta_v_3; string fore; if (current_orbit < final_orbit) { fore = "prograde"; } else if (current_orbit > final_orbit) { fore = "retrograde"; } cout << "Bi-elliptcal transfer stats:" << endl << "Bi-elliptical apoapsis: " << bi_elliptical_apoapsis - planet_radius << "m above sea level" << endl << "Burn 1 = " << delta_v_1 << "m/s prograde" << endl << "Burn 2: " << delta_v_2 << "m/s " << fore << endl << "Burn 3 = " << delta_v_3 << "m/s retrograde" << endl << "Total delta v: " << delta_v_total << "m/s" << endl; } void hohmann_delta_v (double current_orbit, double final_orbit, double standard_gravitational_parameter) { double delta_v_1, delta_v_2, delta_v_total; delta_v_1 = sqrt (((2*standard_gravitational_parameter)/current_orbit)-((2*standard_gravitational_parameter)/(current_orbit + final_orbit))) - sqrt (standard_gravitational_parameter/current_orbit); delta_v_2 = sqrt (((standard_gravitational_parameter)/final_orbit)) - sqrt (((2*standard_gravitational_parameter)/final_orbit)-((2*standard_gravitational_parameter)/(current_orbit + final_orbit))); delta_v_total = delta_v_1 + delta_v_2; string fore; if (current_orbit < final_orbit) { fore = "prograde"; } else if (current_orbit > final_orbit) { fore = "retrograde"; } cout << "Hohmann transfer stats:" << endl << "Burn 1 = " << delta_v_1 << "m/s " << fore << endl << "Burn 2: " << delta_v_2 << "m/s " << fore << endl << "Total delta v: " << delta_v_total << "m/s" << endl; } int main () { cout << "Orbital transfer calculator v2.0\nWritten by TomPN\n18/01/2016\n" << endl; double planet_mass; cout << "Please enter the mass of the body you are in orbit around (in kilograms x10^20): "; cin >> planet_mass; double mass_multiplier = 100000000000000000000.0; planet_mass *= mass_multiplier; double standard_gravitational_parameter = planet_mass*0.0000000000667; double planet_radius; cout << "Please enter the radius of the body you are in orbit around (in metres): "; cin >> planet_radius; double current_orbit; cout << "Please enter your current orbital altitude above sea level (in metres): "; cin >> current_orbit; current_orbit += planet_radius; double final_orbit; cout << "Please enter your desired orbital altitude above sea level (in metres): "; cin >> final_orbit; final_orbit += planet_radius; double sphere_of_influence; cout << "Please enter the radius of the sphere of influence of the body that you are\n currently in orbit around (in metres): "; cin >> sphere_of_influence; cout << endl; double bi_elliptical_apoapsis = (0.9*(sphere_of_influence - final_orbit)) + final_orbit; hohmann_delta_v (current_orbit, final_orbit, standard_gravitational_parameter); cout << endl; bi_elliptical_delta_v (current_orbit, bi_elliptical_apoapsis, final_orbit, standard_gravitational_parameter, planet_radius); cout << endl; system ("PAUSE"); return 0; }
The calculator can be used for raising or lowering your orbit. Please do not edit the source code. If you find an error, point it out to me and I will attempt to fix it.