From 7c5e6568e7b3057cbb1d2167d72b931ecc9df16b Mon Sep 17 00:00:00 2001 From: Timo Kokkonen Date: Sat, 30 Oct 2010 19:57:19 +0300 Subject: [PATCH] Move position vector from planet to quadtree Moving the position information inside the quadtree structure will make it eventually much easier to do varios tree operations within the quadtree code. Most of the quadtree callback functions can be moved inside the quadtree code. This patch implements just the first part of the change, moving the coordinates inside quadtree. Signed-off-by: Timo Kokkonen --- planet.c | 44 ++++++++++++++++++++++---------------------- planet.h | 1 - quadtree.h | 2 ++ 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/planet.c b/planet.c index a79c085..39f8c35 100644 --- a/planet.c +++ b/planet.c @@ -86,8 +86,8 @@ static void setup_planet(struct planet *p, double mass, double total_mass, velocity *= pow(distance / radius, 0.2); - p->pos.x = cos(angle) * distance; - p->pos.y = sin(angle) * distance; + p->tree.pos.x = cos(angle) * distance; + p->tree.pos.y = sin(angle) * distance; p->speed.x = -sin(angle) * velocity; p->speed.y = cos(angle) * velocity; @@ -179,7 +179,7 @@ void draw_planet(SDL_Surface *screen, struct planet *p, float radius = p->radius * cam->zoom; int i; - vector_sub(&p->pos, &cam->pos, &pos); + vector_sub(&p->tree.pos, &cam->pos, &pos); vector_scale(&pos, cam->zoom, &pos); pos.x += screen->w / 2; pos.y += screen->h / 2; @@ -191,7 +191,7 @@ void draw_planet(SDL_Surface *screen, struct planet *p, struct planet *q = tree_to_planet(p->tree.child[i]); - draw_line(screen, &p->pos, &q->pos, + draw_line(screen, &p->tree.pos, &q->tree.pos, p->r, p->g, p->b, cam); } } @@ -204,7 +204,7 @@ int gravitize_planets(struct planet *a, struct planet *b, const double time) struct vector distance, sum; double dist, f, acc; - vector_sub(&a->pos, &b->pos, &distance); + vector_sub(&a->tree.pos, &b->tree.pos, &distance); dist = vector_abs(&distance); @@ -243,7 +243,7 @@ static void _merge_planets(struct planet *a, struct planet *b) mass = a->mass + b->mass; if (a->mass < b->mass) - a->pos = b->pos; + a->tree.pos = b->tree.pos; a->r = (a->r * a->mass + b->r * b->mass) / mass; a->g = (a->g * a->mass + b->g * b->mass) / mass; @@ -280,11 +280,11 @@ static int planet_search_when_moving(struct quadtree *node, int up = 0, left = 0, right = 0, down = 0; for (i = 0; i < 2; i++) { - if (it->limit[i].x < p->pos.x) + if (it->limit[i].x < p->tree.pos.x) left = 1; else right = 1; - if (it->limit[i].y < p->pos.y) + if (it->limit[i].y < p->tree.pos.y) up = 1; else down = 1; @@ -325,19 +325,19 @@ struct planet *move_planet(struct planet *p, const double time) int modify = 0; vector_scale(&p->speed, time, &tmp); - vector_add(&p->pos, &tmp, &new_pos); + vector_add(&p->tree.pos, &tmp, &new_pos); /* Check if we have crossed any of the parents */ parent = p->tree.parent; while (parent) { pa = tree_to_planet(parent); - if (p->pos.x < pa->pos.x && new_pos.x > pa->pos.x) + if (p->tree.pos.x < pa->tree.pos.x && new_pos.x > pa->tree.pos.x) modify = 1; - if (p->pos.x > pa->pos.x && new_pos.x < pa->pos.x) + if (p->tree.pos.x > pa->tree.pos.x && new_pos.x < pa->tree.pos.x) modify = 1; - if (p->pos.y < pa->pos.y && new_pos.y > pa->pos.y) + if (p->tree.pos.y < pa->tree.pos.y && new_pos.y > pa->tree.pos.y) modify = 1; - if (p->pos.y > pa->pos.y && new_pos.y < pa->pos.y) + if (p->tree.pos.y > pa->tree.pos.y && new_pos.y < pa->tree.pos.y) modify = 1; if (!modify) { @@ -346,7 +346,7 @@ struct planet *move_planet(struct planet *p, const double time) } tree_parent = quadtree_del(&p->tree, &planet_ops); - p->pos = new_pos; + p->tree.pos = new_pos; quadtree_add(tree_parent, &p->tree, &planet_ops); return tree_to_planet(tree_parent); } @@ -357,13 +357,13 @@ struct planet *move_planet(struct planet *p, const double time) * them into correct place within the tree. */ it.qt_iterator.head = &p->tree; - it.limit[0] = p->pos; + it.limit[0] = p->tree.pos; it.limit[1] = new_pos; it.qt_iterator.direction = planet_search_when_moving; it.qt_iterator.callback = planet_move_iterator; walk_quadtree(&it.qt_iterator); } - p->pos = new_pos; + p->tree.pos = new_pos; return tree_to_planet(quadtree_find_parent(&p->tree)); } @@ -371,7 +371,7 @@ struct planet *move_planet(struct planet *p, const double time) void print_planet(const struct planet *p) { printf("pos: (%f,%f), speed: (%f,%f), mass: %f, radius %f\n", - p->pos.x, p->pos.y, p->speed.x, p->speed.y, p->mass, p->radius); + p->tree.pos.x, p->tree.pos.y, p->speed.x, p->speed.y, p->mass, p->radius); } int planet_spatial_compare(struct quadtree *ta, struct quadtree *tb) @@ -381,8 +381,8 @@ int planet_spatial_compare(struct quadtree *ta, struct quadtree *tb) a = tree_to_planet(ta); b = tree_to_planet(tb); - up = b->pos.y < a->pos.y; - left = b->pos.x < a->pos.x; + up = b->tree.pos.y < a->tree.pos.y; + left = b->tree.pos.x < a->tree.pos.x; if (up && left) return 0; @@ -402,11 +402,11 @@ int planet_search_rectangular(struct quadtree *node, int up = 0, left = 0, right = 0, down = 0; for (i = 0; i < 2; i++) { - if (it->limit[i].x < p->pos.x) + if (it->limit[i].x < p->tree.pos.x) left = 1; else right = 1; - if (it->limit[i].y < p->pos.y) + if (it->limit[i].y < p->tree.pos.y) up = 1; else down = 1; @@ -452,7 +452,7 @@ static void planet_recalculate_stats(struct quadtree *node) c = tree_to_planet(node->child[i]); p->tree_mass += c->tree_mass; - vector_sub(&p->pos, &c->pos, &vect); + vector_sub(&p->tree.pos, &c->tree.pos, &vect); dist = vector_abs(&vect); dist += c->tree_area; p->tree_area = MAX(p->tree_area, dist); diff --git a/planet.h b/planet.h index 89f232a..9f71b99 100644 --- a/planet.h +++ b/planet.h @@ -11,7 +11,6 @@ struct planet { struct vector speed; - struct vector pos; struct list_head list; struct quadtree tree; double mass; diff --git a/quadtree.h b/quadtree.h index 0784147..87f3b8c 100644 --- a/quadtree.h +++ b/quadtree.h @@ -4,8 +4,10 @@ #include #include "utils.h" +#include "vector.h" struct quadtree { + struct vector pos; struct quadtree *child[4]; struct quadtree *parent; -- 2.44.0