#ifndef DIJKSTRAGRAPH_H #define DIJKSTRAGRAPH_H #include #define DIJKSTRA_WEIGHT_AUTO (-1) typedef int dijkstra_cost; #define DIJKSTRA_COST_MAX INT_MAX #define DIJKSTRA_COST_MIN 1.0 struct dijkstra_solver { GList *nodes; GList *paths; GList *layers; }; struct position { float x; float y; int z; }; struct dijkstra_path { struct dijkstra_node *source; struct dijkstra_node *destination; char *name; dijkstra_cost weight; }; enum dijkstra_layer_type {STREET, TRAINLINE, ACCESS}; struct dijkstra_layer { char *name; enum dijkstra_layer_type type; char *access; }; struct dijkstra_node { struct position position; GList *paths; struct dijkstra_layer *layer; /* Layer (this will strcmp'd for matching) */ int uid; }; struct offset_map { char *name; int offset; }; /* User Functions */ struct dijkstra_path *dijkstra_path_new_to_list(struct dijkstra_solver *solver, float x1, float y1, float x2, float y2, int z1, int z2, struct dijkstra_layer *layer, char *name, dijkstra_cost weight); struct dijkstra_solver *dijkstra_solver_new(); void dijkstra_solver_free(struct dijkstra_solver *solver); struct dijkstra_layer *dijkstra_layer_new_to_list(struct dijkstra_solver *solver, enum dijkstra_layer_type type, char *name, char *access); /* Library functions */ struct dijkstra_node *dijkstra_node_get_connection(struct dijkstra_node *node, struct dijkstra_path *path); struct dijkstra_node *dijkstra_node_find_closest_node(struct dijkstra_solver *solver, struct position *position); void dijkstra_path_intersect_all(struct dijkstra_solver *solver, struct dijkstra_path *path, struct dijkstra_path *path_last); /* For debugging only */ struct dijkstra_node *dijkstra_node_new_to_list(GList **list, float x, float y, int z, struct dijkstra_layer *layer); #endif // DIJKSTRAGRAPH_H