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 <kaapeli@itanic.dy.fi>
velocity *= pow(distance / radius, 0.2);
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;
p->speed.x = -sin(angle) * velocity;
p->speed.y = cos(angle) * velocity;
float radius = p->radius * cam->zoom;
int i;
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;
vector_scale(&pos, cam->zoom, &pos);
pos.x += screen->w / 2;
pos.y += screen->h / 2;
struct planet *q = tree_to_planet(p->tree.child[i]);
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);
}
}
p->r, p->g, p->b, cam);
}
}
struct vector distance, sum;
double dist, f, acc;
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);
dist = vector_abs(&distance);
mass = a->mass + b->mass;
if (a->mass < b->mass)
mass = a->mass + b->mass;
if (a->mass < b->mass)
+ 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;
a->r = (a->r * a->mass + b->r * b->mass) / mass;
a->g = (a->g * a->mass + b->g * b->mass) / mass;
int up = 0, left = 0, right = 0, down = 0;
for (i = 0; i < 2; i++) {
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;
left = 1;
else
right = 1;
- if (it->limit[i].y < p->pos.y)
+ if (it->limit[i].y < p->tree.pos.y)
int modify = 0;
vector_scale(&p->speed, time, &tmp);
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);
/* 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)
- 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)
- 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)
- 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) {
modify = 1;
if (!modify) {
}
tree_parent = quadtree_del(&p->tree, &planet_ops);
}
tree_parent = quadtree_del(&p->tree, &planet_ops);
quadtree_add(tree_parent, &p->tree, &planet_ops);
return tree_to_planet(tree_parent);
}
quadtree_add(tree_parent, &p->tree, &planet_ops);
return tree_to_planet(tree_parent);
}
* them into correct place within the tree.
*/
it.qt_iterator.head = &p->tree;
* them into correct place within the tree.
*/
it.qt_iterator.head = &p->tree;
+ 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);
}
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);
}
return tree_to_planet(quadtree_find_parent(&p->tree));
}
return tree_to_planet(quadtree_find_parent(&p->tree));
}
void print_planet(const struct planet *p)
{
printf("pos: (%f,%f), speed: (%f,%f), mass: %f, radius %f\n",
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)
}
int planet_spatial_compare(struct quadtree *ta, struct quadtree *tb)
a = tree_to_planet(ta);
b = tree_to_planet(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;
if (up && left)
return 0;
int up = 0, left = 0, right = 0, down = 0;
for (i = 0; i < 2; i++) {
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;
left = 1;
else
right = 1;
- if (it->limit[i].y < p->pos.y)
+ if (it->limit[i].y < p->tree.pos.y)
c = tree_to_planet(node->child[i]);
p->tree_mass += c->tree_mass;
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);
dist = vector_abs(&vect);
dist += c->tree_area;
p->tree_area = MAX(p->tree_area, dist);
struct planet {
struct vector speed;
struct planet {
struct vector speed;
struct list_head list;
struct quadtree tree;
double mass;
struct list_head list;
struct quadtree tree;
double mass;
#include <string.h>
#include "utils.h"
#include <string.h>
#include "utils.h"
struct quadtree *child[4];
struct quadtree *parent;
struct quadtree *child[4];
struct quadtree *parent;