19const char _UNIT_TIME[] = N_(
"sec");
20const char _UNIT_PER_TIME[] = N_(
"/sec");
21const char _UNIT_DISTANCE[] = N_(
"km");
22const char _UNIT_SPEED[] = N_(
"km/s");
23const char _UNIT_ACCEL[] = N_(
"km/s²");
24const char _UNIT_ENERGY[] = N_(
"GJ");
25const char _UNIT_POWER[] = N_(
"GW");
26const char _UNIT_ANGLE[] = N_(
"°");
27const char _UNIT_ROTATION[] = N_(
"°/s");
28const char _UNIT_MASS[] = N_(
"t");
29const char _UNIT_CPU[] = N_(
"PFLOP");
30const char _UNIT_UNIT[] = N_(
"u");
31const char _UNIT_PERCENT[] = N_(
"%");
36static double angle_cleanup(
double a )
38 if (
FABS(a) >= 2.*M_PI) {
52double angle_diff(
double ref,
double a )
55 double a1 = angle_cleanup(ref);
56 double a2 = angle_cleanup(a);
60 d = (
d < M_PI) ?
d :
d - 2.*M_PI;
61 d = (
d > -M_PI) ?
d :
d + 2.*M_PI;
79static void solid_update_euler(
Solid *obj,
double dt )
81 double px,py, vx,vy, ax,ay, th;
89 if (obj->
dir >= 2*M_PI)
102 sdir = sin(obj->
dir);
103 cdir = cos(obj->
dir);
116 vec2_cset( &obj->
vel, vx, vy );
117 vec2_cset( &obj->
pos, px, py );
143#define RK4_MIN_H 0.01
144static void solid_update_rk4(
Solid *obj,
double dt )
147 double h, px,py, vx,vy;
148 double vmod, vang, th;
164 N = (int)(dt / RK4_MIN_H);
167 vmod = MOD( vx, vy );
168 vint = (int) vmod/100.;
176 for (
int i=0; i < N; i++) {
177 double ix, iy, tx, ty;
179 double ax = th*cos(obj->
dir);
180 double ay = th*sin(obj->
dir);
184 vmod = MOD( vx, vy );
187 vang = ANGLE( vx, vy ) + M_PI;
191 ax += vmod * cos(vang);
192 ay += vmod * sin(vang);
219 vec2_cset( &obj->
vel, vx, vy );
220 vec2_cset( &obj->
pos, px, py );
223 if (obj->
dir >= 2.*M_PI)
225 else if (obj->
dir < 0.)
232double solid_maxspeed(
const Solid *s,
double speed,
double accel )
235 return speed + accel / 3.;
247void solid_init(
Solid* dest,
double mass,
double dir,
248 const vec2* pos,
const vec2* vel,
int update )
250 memset(dest, 0,
sizeof(
Solid));
262 if ((dest->
dir > 2.*M_PI) || (dest->
dir < 0.))
263 dest->
dir = fmod(dest->
dir, 2.*M_PI);
267 vectnull( &dest->
vel );
273 vectnull( &dest->
pos );
283 case SOLID_UPDATE_RK4:
284 dest->
update = solid_update_rk4;
287 case SOLID_UPDATE_EULER:
288 dest->
update = solid_update_euler;
292 WARN(_(
"Solid initialization did not specify correct update function!"));
293 dest->
update = solid_update_rk4;
Header file with generic functions and naev-specifics.
Represents a solid in the game.
void(* update)(struct Solid_ *, double)