mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-27 02:31:00 +00:00
ksp: finally managed to make orbit in the simulator
This commit is contained in:
parent
13c1a4eca0
commit
f23458546f
23
ksp/c/atan_test.c
Normal file
23
ksp/c/atan_test.c
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define PI 3.14159265358979323846264
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
double theta;
|
||||||
|
double x,y,a;
|
||||||
|
|
||||||
|
for(theta=0;theta<360;theta+=1.0) {
|
||||||
|
x=sin(theta*PI/180.0);
|
||||||
|
y=cos(theta*PI/180.0);
|
||||||
|
if (y<0) a=180.0+((atan(x/y))*180.0/PI);
|
||||||
|
else a=(atan(x/y))*180.0/PI;
|
||||||
|
printf("%lf x=%lf y=%lf atan(x/y)=%lf\n",
|
||||||
|
theta,x,y,a);
|
||||||
|
// printf("%lf %lf\n",x*600.0,y*600.0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -28,13 +28,28 @@ static void htabvtab(int x,int y) {
|
|||||||
printf("%c[%d;%dH",27,y,x);
|
printf("%c[%d;%dH",27,y,x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* TODO: want 2d-vectors at least */
|
|
||||||
|
|
||||||
#define KERBIN_RADIUS 600000.0
|
#define KERBIN_RADIUS 600000.0
|
||||||
|
|
||||||
|
int autopilot(double fuel_left, double altitude, double *angle) {
|
||||||
|
|
||||||
|
if (fuel_left>25.0) {
|
||||||
|
*angle=45.0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (altitude>KERBIN_RADIUS+40000) {
|
||||||
|
*angle=100.0; /* actually want tanegent to surface */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
|
FILE *logfile;
|
||||||
|
|
||||||
double angle=45;
|
double angle=45;
|
||||||
|
|
||||||
double capsule_mass=1.0;
|
double capsule_mass=1.0;
|
||||||
@ -49,6 +64,7 @@ int main(int argc, char **argv) {
|
|||||||
double tank_mass=(0.5)*tanks; /* tons */
|
double tank_mass=(0.5)*tanks; /* tons */
|
||||||
double fuel_mass=(4.0)*tanks; /* tons */
|
double fuel_mass=(4.0)*tanks; /* tons */
|
||||||
double total_fuel=fuel_mass;
|
double total_fuel=fuel_mass;
|
||||||
|
double fuel_left=100.0;
|
||||||
|
|
||||||
double gravity=-9.8; /* m/s^2 */
|
double gravity=-9.8; /* m/s^2 */
|
||||||
double gravity_x=0.0;
|
double gravity_x=0.0;
|
||||||
@ -57,6 +73,7 @@ int main(int argc, char **argv) {
|
|||||||
/* Kerbin radius = 600km */
|
/* Kerbin radius = 600km */
|
||||||
|
|
||||||
|
|
||||||
|
double rocket_velocity=0.0;
|
||||||
double rocket_velocity_x=0.0; /* m/s */
|
double rocket_velocity_x=0.0; /* m/s */
|
||||||
double rocket_velocity_y=0.0; /* m/s */
|
double rocket_velocity_y=0.0; /* m/s */
|
||||||
|
|
||||||
@ -64,18 +81,27 @@ int main(int argc, char **argv) {
|
|||||||
double rocket_acceleration_y=0.0; /* m/s^2 */
|
double rocket_acceleration_y=0.0; /* m/s^2 */
|
||||||
|
|
||||||
double rocket_x=0;
|
double rocket_x=0;
|
||||||
double rocket_y=KERBIN_RADIUS+1000;
|
double rocket_y=KERBIN_RADIUS+10;
|
||||||
double rocket_altitude=KERBIN_RADIUS; /* m */
|
double rocket_altitude=KERBIN_RADIUS; /* m */
|
||||||
|
|
||||||
double deltav,twr;
|
double deltav,twr;
|
||||||
double total_mass,empty_mass;
|
double total_mass,empty_mass;
|
||||||
|
|
||||||
|
double v0_x,v0_y;
|
||||||
|
|
||||||
double time=0.0; /* s */
|
double time=0.0; /* s */
|
||||||
|
|
||||||
int stage=1;
|
int stage=1;
|
||||||
|
|
||||||
|
int log_step=0;
|
||||||
|
|
||||||
char input;
|
char input;
|
||||||
|
|
||||||
|
int thrusting=1;
|
||||||
|
|
||||||
|
|
||||||
|
logfile=fopen("log.jgr","w");
|
||||||
|
|
||||||
total_mass=engine_mass+tank_mass+fuel_mass+capsule_mass;
|
total_mass=engine_mass+tank_mass+fuel_mass+capsule_mass;
|
||||||
empty_mass=total_mass-fuel_mass;
|
empty_mass=total_mass-fuel_mass;
|
||||||
|
|
||||||
@ -94,43 +120,61 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
while(1) {
|
while(1) {
|
||||||
|
|
||||||
if (fuel_mass<0.1) {
|
fuel_left=fuel_mass*100.0/total_fuel;
|
||||||
fuel_mass=0.0;
|
|
||||||
rocket_acceleration_x=0;
|
|
||||||
rocket_acceleration_y=0;
|
|
||||||
|
|
||||||
|
thrusting=autopilot(fuel_left, rocket_altitude,&angle);
|
||||||
|
|
||||||
|
if (thrusting) {
|
||||||
|
if (fuel_mass<0.1) {
|
||||||
|
fuel_mass=0.0;
|
||||||
|
rocket_acceleration_x=0;
|
||||||
|
rocket_acceleration_y=0;
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rocket_acceleration_x=(engine_thrust/total_mass)*sin_degrees(angle);
|
||||||
|
rocket_acceleration_y=(engine_thrust/total_mass)*cos_degrees(angle);
|
||||||
|
|
||||||
|
fuel_mass=fuel_mass-fuel_flow_rate;
|
||||||
|
total_mass=engine_mass+tank_mass+fuel_mass+capsule_mass;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
rocket_acceleration_x=(engine_thrust/total_mass)*sin_degrees(angle);
|
rocket_acceleration_x=0.0;
|
||||||
rocket_acceleration_y=(engine_thrust/total_mass)*cos_degrees(angle);
|
rocket_acceleration_y=0.0;
|
||||||
|
|
||||||
fuel_mass=fuel_mass-fuel_flow_rate;
|
|
||||||
total_mass=engine_mass+tank_mass+fuel_mass+capsule_mass;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gravity_angle=atan(rocket_x/rocket_y);
|
if (rocket_y<0) gravity_angle=PI+atan(rocket_x/rocket_y);
|
||||||
|
else gravity_angle=atan(rocket_x/rocket_y);
|
||||||
|
|
||||||
gravity_y=cos(gravity_angle)*gravity;
|
gravity_y=cos(gravity_angle)*gravity;
|
||||||
gravity_x=sin(gravity_angle)*gravity;
|
gravity_x=sin(gravity_angle)*gravity;
|
||||||
|
|
||||||
rocket_acceleration_y+=gravity_y;
|
rocket_acceleration_y+=gravity_y;
|
||||||
rocket_acceleration_x+=gravity_x;
|
rocket_acceleration_x+=gravity_x;
|
||||||
|
|
||||||
rocket_velocity_y=rocket_velocity_y+rocket_acceleration_y*1.0;
|
/* v=v0+at */
|
||||||
rocket_velocity_x=rocket_velocity_x+rocket_acceleration_x*1.0;
|
v0_x=rocket_velocity_x;
|
||||||
|
v0_y=rocket_velocity_y;
|
||||||
|
|
||||||
rocket_y=rocket_y+
|
rocket_velocity_y=v0_y+rocket_acceleration_y*1.0;
|
||||||
(rocket_velocity_y*1.0)+
|
rocket_velocity_x=v0_x+rocket_acceleration_x*1.0;
|
||||||
0.5*rocket_acceleration_y*1.0*1.0;
|
rocket_velocity=vector_magnitude(rocket_velocity_x,rocket_velocity_y),
|
||||||
|
|
||||||
rocket_x=rocket_x+
|
/* deltaX=1/2 (v+v0)t */
|
||||||
(rocket_velocity_x*1.0)+
|
/* could also use deltax=v0t+(1/2)*a*t*t */
|
||||||
0.5*rocket_acceleration_x*1.0*1.0;
|
rocket_y=rocket_y+0.5*(v0_y+rocket_velocity_y)*1.0;
|
||||||
|
rocket_x=rocket_x+0.5*(v0_x+rocket_velocity_x)*1.0;
|
||||||
|
|
||||||
rocket_altitude=vector_magnitude(rocket_x,rocket_y);
|
rocket_altitude=vector_magnitude(rocket_x,rocket_y);
|
||||||
|
|
||||||
if (rocket_altitude<KERBIN_RADIUS) {
|
if (rocket_altitude<KERBIN_RADIUS) {
|
||||||
printf("CRASH!\n");
|
if (rocket_velocity<20.0) {
|
||||||
|
printf("LANDED!\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("CRASHED!\n");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,7 +190,7 @@ int main(int argc, char **argv) {
|
|||||||
printf("Time: %lf\n",time);
|
printf("Time: %lf\n",time);
|
||||||
printf("ALT: %lf m\tg=%lf\n",rocket_altitude-KERBIN_RADIUS,gravity);
|
printf("ALT: %lf m\tg=%lf\n",rocket_altitude-KERBIN_RADIUS,gravity);
|
||||||
printf("VEL: %lf m/s\tStage: %d\n",
|
printf("VEL: %lf m/s\tStage: %d\n",
|
||||||
vector_magnitude(rocket_velocity_x,rocket_velocity_y),
|
rocket_velocity,
|
||||||
stage);
|
stage);
|
||||||
printf("ACCEL: %lf g\tFuel: %lf%%",
|
printf("ACCEL: %lf g\tFuel: %lf%%",
|
||||||
vector_magnitude(rocket_acceleration_x,rocket_acceleration_y)/9.8,
|
vector_magnitude(rocket_acceleration_x,rocket_acceleration_y)/9.8,
|
||||||
@ -187,8 +231,20 @@ int main(int argc, char **argv) {
|
|||||||
scanf("%c",&input);
|
scanf("%c",&input);
|
||||||
|
|
||||||
time+=1.0;
|
time+=1.0;
|
||||||
|
|
||||||
|
if (log_step==0) {
|
||||||
|
if (logfile) {
|
||||||
|
fprintf(logfile,"%lf %lf\n",rocket_x/1000.0,rocket_y/1000.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log_step++;
|
||||||
|
if (log_step>10) {
|
||||||
|
log_step=0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (logfile) fclose(logfile);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user