18static double angle_cleanup(
double a )
20 if (
FABS(a) >= 2.*M_PI) {
21 double na = fmod(a, 2.*M_PI);
34double angle_diff(
double ref,
double a )
37 double a1 = angle_cleanup(ref);
38 double a2 = angle_cleanup(a);
42 d = (
d < M_PI) ?
d :
d - 2.*M_PI;
43 d = (
d > -M_PI) ?
d :
d + 2.*M_PI;
62static void solid_update_euler(
Solid *obj,
double dt )
64 double px,py, vx,vy, ax,ay, th;
69 if (obj->
dir >= 2*M_PI)
86 ax = th*cdir / obj->
mass;
87 ay = th*sdir / obj->
mass;
96 vec2_cset( &obj->
vel, vx, vy );
97 vec2_cset( &obj->
pos, px, py );
123#define RK4_MIN_H 0.01
124static void solid_update_rk4(
Solid *obj,
double dt )
127 double h, px,py, vx,vy;
128 double ix,iy, tx,ty, th;
142 N = (int)(dt / RK4_MIN_H);
145 vmod = MOD( vx, vy );
146 vint = (int) vmod/100.;
154 for (
int i=0; i < N; i++) {
156 double ax = th*cos(obj->
dir);
157 double ay = th*sin(obj->
dir);
161 vmod = MOD( vx, vy );
164 vang = ANGLE( vx, vy ) + M_PI;
168 ax += vmod * cos(vang);
169 ay += vmod * sin(vang);
196 vec2_cset( &obj->
vel, vx, vy );
197 vec2_cset( &obj->
pos, px, py );
200 if (obj->
dir >= 2.*M_PI)
202 else if (obj->
dir < 0.)
209double solid_maxspeed(
const Solid *s,
double speed,
double thrust )
211 return speed + thrust / (s->
mass * 3.);
223void solid_init(
Solid* dest,
double mass,
double dir,
224 const vec2* pos,
const vec2* vel,
int update )
226 memset(dest, 0,
sizeof(
Solid));
238 if ((dest->
dir > 2.*M_PI) || (dest->
dir < 0.))
239 dest->
dir = fmod(dest->
dir, 2.*M_PI);
243 vectnull( &dest->
vel );
249 vectnull( &dest->
pos );
258 case SOLID_UPDATE_RK4:
259 dest->
update = solid_update_rk4;
262 case SOLID_UPDATE_EULER:
263 dest->
update = solid_update_euler;
267 WARN(_(
"Solid initialization did not specify correct update function!"));
268 dest->
update = solid_update_rk4;
282Solid* solid_create(
double mass,
double dir,
283 const vec2* pos,
const vec2* vel,
int update )
287 ERR(_(
"Out of Memory"));
288 solid_init( dyn, mass, dir, pos, vel, update );
297void solid_free(
Solid* src )
Header file with generic functions and naev-specifics.
Represents a solid in the game.
void(* update)(struct Solid_ *, double)