18const char _UNIT_TIME[] = N_(
"sec" );
19const char _UNIT_PER_TIME[] = N_(
"/sec" );
20const char _UNIT_DISTANCE[] = N_(
"km" );
21const char _UNIT_SPEED[] = N_(
"km/s" );
22const char _UNIT_ACCEL[] = N_(
"km/s²" );
23const char _UNIT_ENERGY[] = N_(
"GJ" );
24const char _UNIT_POWER[] = N_(
"GW" );
25const char _UNIT_ANGLE[] = N_(
"°" );
26const char _UNIT_ROTATION[] = N_(
"°/s" );
27const char _UNIT_MASS[] = N_(
"t" );
28const char _UNIT_CPU[] = N_(
"PFLOP" );
29const char _UNIT_UNIT[] = N_(
"u" );
30const char _UNIT_PERCENT[] = N_(
"%" );
35double angle_clean(
double a )
37 if (
FABS( a ) >= 2. * M_PI ) {
38 a = fmod( a, 2. * M_PI );
52double angle_diff(
double ref,
double a )
55 double a1 = angle_clean( ref );
56 double a2 = angle_clean( 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 obj->
dir = angle_clean( obj->
dir );
99 sdir = sin( obj->
dir );
100 cdir = cos( obj->
dir );
113 vec2_cset( &obj->
vel, vx, vy );
114 vec2_cset( &obj->
pos, px, py );
140#define RK4_MIN_H 0.01
141static void solid_update_rk4(
Solid *obj,
double dt )
144 double h, px, py, vx, vy;
145 double vmod, vang, th;
160 if ( dt > RK4_MIN_H )
161 N = (int)( dt / RK4_MIN_H );
164 vmod = MOD( vx, vy );
165 vint = (int)vmod / 100.;
173 for (
int i = 0; i < N; i++ ) {
174 double ix, iy, tx, ty;
176 double ax = th * cos( obj->
dir );
177 double ay = th * sin( obj->
dir );
181 vmod = MOD( vx, vy );
184 vang = ANGLE( vx, vy ) + M_PI;
188 ax += vmod * cos( vang );
189 ay += vmod * sin( vang );
195 tx += 2. * ix + h * tx;
196 tx += 2. * ix + h * tx;
205 ty += 2. * iy + h * ty;
206 ty += 2. * iy + h * ty;
216 vec2_cset( &obj->
vel, vx, vy );
217 vec2_cset( &obj->
pos, px, py );
220 obj->
dir = angle_clean( obj->
dir );
226double solid_maxspeed(
const Solid *s,
double speed,
double accel )
229 return speed + accel / 3.;
241void solid_init(
Solid *dest,
double mass,
double dir,
const vec2 *pos,
242 const vec2 *vel,
int update )
244 memset( dest, 0,
sizeof(
Solid ) );
255 dest->
dir = angle_clean( dir );
259 vectnull( &dest->
vel );
265 vectnull( &dest->
pos );
275 case SOLID_UPDATE_RK4:
276 dest->
update = solid_update_rk4;
279 case SOLID_UPDATE_EULER:
280 dest->
update = solid_update_euler;
285 _(
"Solid initialization did not specify correct update function!" ) );
286 dest->
update = solid_update_rk4;
Header file with generic functions and naev-specifics.
Represents a solid in the game.
void(* update)(struct Solid_ *, double)