#ifndef TECTONICS_H #define TECTONICS_H #include #include #include struct point_t { double x, y; void *data; }; struct quad_region_t { struct point_t center; double half_dim; }; struct quadtree_node_t { struct quad_region_t region; int id; /* children */ struct quadtree_node_t *nw, *ne, *sw, *se; }; struct world_t { struct point_t *points; struct quadtree_node_t tree; int n_points; }; /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * quadtree * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ bool contains_point(struct quad_region_t region, struct point_t pt); struct quadtree_node_t new_node(struct point_t center, double half_dim); void subdivide(struct quadtree_node_t *node, struct point_t *points); bool insert(struct quadtree_node_t *node, struct point_t *points, int id); int get_closest(struct quadtree_node_t *root, struct point_t pt); void draw_quadtree(cairo_t *cr, struct quadtree_node_t *root); void free_tree(struct quadtree_node_t *root); /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * util * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ void get_cairo_size(cairo_t *cr, int *width, int *height); double rand01(); double distance(double x0, double y0, double x1, double y1); /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * * worlds * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ void create_world(struct world_t *world, int n_points); void free_world(struct world_t *world); void render_world(cairo_t *cr, struct world_t *world); void run_world_step(struct world_t *world); #endif