@ -132,21 +132,21 @@ void calculate_velocities(SimulationState* sim, OrbitParams* orbit_params) {
// v = sqrt(G * M_other / r)
double speed = sqrt ( G * other_mass / distance ) ;
// Create velocity perpendicular to position vector (same logic as below )
// Create velocity perpendicular to position vector (counter-clockwise from +Z )
Vec3 z_axis = { 0.0 , 0.0 , 1.0 } ;
Vec3 vel_dir = {
r . y * z_axis . z - r . z * z_axis . y ,
r . z * z_axis . x - r . x * z_axis . z ,
r . x * z_axis . y - r . y * z_axis . x
z_axis . y * r . z - z_axis . z * r . y ,
z_axis . z * r . x - z_axis . x * r . z ,
z_axis . x * r . y - z_axis . y * r . x
} ;
// If r is parallel to z-axis, use x-axis instead
double cross_mag = vec3_magnitude ( vel_dir ) ;
if ( cross_mag < 0.01 ) {
Vec3 x_axis = { 1.0 , 0.0 , 0.0 } ;
vel_dir . x = r . y * x_axis . z - r . z * x_axis . y ;
vel_dir . y = r . z * x_axis . x - r . x * x_axis . z ;
vel_dir . z = r . x * x_axis . y - r . y * x_axis . x ;
vel_dir . x = x_axis . y * r . z - x_axis . z * r . y ;
vel_dir . y = x_axis . z * r . x - x_axis . x * r . z ;
vel_dir . z = x_axis . x * r . y - x_axis . y * r . x ;
}
// Normalize and scale by orbital speed
@ -197,23 +197,23 @@ void calculate_velocities(SimulationState* sim, OrbitParams* orbit_params) {
// Create velocity perpendicular to position vector
// If position is mostly in XY plane, make velocity in XY plane
// Cross product of r with z-axis gives perpendicular vector in XY plane
// Cross product z_axis x r gives counter-clockwise orbit when viewed from +Z
Vec3 z_axis = { 0.0 , 0.0 , 1.0 } ;
// Calculate cross product: r x z_axis
// Calculate cross product: z_axis x r
Vec3 vel_dir = {
r . y * z_axis . z - r . z * z_axis . y ,
r . z * z_axis . x - r . x * z_axis . z ,
r . x * z_axis . y - r . y * z_axis . x
z_axis . y * r . z - z_axis . z * r . y ,
z_axis . z * r . x - z_axis . x * r . z ,
z_axis . x * r . y - z_axis . y * r . x
} ;
// If r is parallel to z-axis, use x-axis instead
double cross_mag = vec3_magnitude ( vel_dir ) ;
if ( cross_mag < 0.01 ) {
Vec3 x_axis = { 1.0 , 0.0 , 0.0 } ;
vel_dir . x = r . y * x_axis . z - r . z * x_axis . y ;
vel_dir . y = r . z * x_axis . x - r . x * x_axis . z ;
vel_dir . z = r . x * x_axis . y - r . y * x_axis . x ;
vel_dir . x = x_axis . y * r . z - x_axis . z * r . y ;
vel_dir . y = x_axis . z * r . x - x_axis . x * r . z ;
vel_dir . z = x_axis . x * r . y - x_axis . y * r . x ;
}
// Normalize and scale by orbital speed
@ -228,6 +228,7 @@ void calculate_velocities(SimulationState* sim, OrbitParams* orbit_params) {
// Calculate SOI radii for all bodies
void calculate_soi_radii ( SimulationState * sim ) {
const double AU = 1.496e11 ;
for ( int i = 0 ; i < sim - > body_count ; i + + ) {
CelestialBody * body = & sim - > bodies [ i ] ;
@ -237,11 +238,11 @@ void calculate_soi_radii(SimulationState* sim) {
} else if ( body - > parent_index > = 0 & & body - > parent_index < sim - > body_count ) {
CelestialBody * parent = & sim - > bodies [ body - > parent_index ] ;
// Calculate semi-major axis (distance to parent)
double semi_major_axis = vec3_distance ( body - > position , parent - > position ) ;
// Update SOI using Hill sphere approximation
update_soi ( body , parent , semi_major_axis ) ;
update_soi ( body , parent , body - > semi_major_axis ) ;
printf ( " %s SOI radius: %.6e m (%.6f AU) \n " ,
body - > name , body - > soi_radius , body - > soi_radius / AU ) ;
}
}
}