itr.qt_iterator.direction = planet_search_rectangular;
itr.qt_iterator.callback = planet_draw_iterator;
- planet = malloc(sizeof(*planet));
+ planet_root = planet = malloc(sizeof(*planet));
init_planet(planet);
create_planets(planet, num_of_planets, total_mass, range);
ticks = SDL_GetTicks();
while (1) {
planets = 0;
+ gravitations = 0;
- gravitize_planet_tree(planet, step_time);
+ gravitize_planet_tree(planet_root, step_time);
+
+ prune_planet_tree(planet_root);
list_for_each_entry(pl1, &planet_root->list, list) {
planet_root = move_planet(pl1, step_time);
printf(" \rfps: %.2f, steps/s: %.2f, planets: %d"
", scale %.2f, zoom %.2f, step %ld, visible %d,"
- " depth %ld, c:%ld, mass %.f, area: %.f",
+ " depth %ld, c:%ld, mass %.f, area: %.f, g: %.2f",
last_fps, last_sps, planets, status.time_scale,
camera.zoom, step_count, visible_planets,
planet_root->tree.depth, planet_root->tree.children,
- planet_root->tree_mass, planet_root->tree_area);
+ planet_root->tree_mass, planet_root->tree_area,
+ gravitations / (float) planets);
fflush(stdout);
#include "utils.h"
struct quadtree_ops planet_ops;
+int gravitations;
static void putpixel(struct SDL_Surface *screen, const int x, const int y,
const unsigned char r, const unsigned char g,
struct vector distance, sum;
double dist, f, acc;
+ if (a->to_be_deleted || b->to_be_deleted)
+ return 0;
+
+ gravitations++;
+
vector_sub(&a->pos, &b->pos, &distance);
dist = vector_abs(&distance);
struct vector distance, sum;
double dist, f, acc;
+ if (a->to_be_deleted || b->to_be_deleted)
+ return 0;
+
+ gravitations++;
+
vector_sub(&a->pos, &b->pos, &distance);
dist = vector_abs(&distance);
SDL_Surface *screen;
};
+extern int gravitations;
+
#define list_to_planet(list_head) container_of((list_head), struct planet, list)
#define tree_to_planet(qt) container_of((qt), struct planet, tree)
struct planet *merge_planets(struct planet *a, struct planet *b);
struct planet *move_planet(struct planet *p, const double time);
void print_planet(const struct planet *p);
+struct planet *prune_planet_tree(struct planet *p);
int planet_spatial_compare(struct quadtree *a, struct quadtree *b);
int planet_search_rectangular(struct quadtree *node,