/* Represents an undirected graph. * Also contains the vertex and edge classes * These are not quite traditional graph theory graphs, because they also have * cartesian coordinates, and can do some math to ensure planarity is preserved * (that is, planarity in the existant layout, not being isomorphic to a * planar) * * Each vertex also contains a 'colour' and a 'score', which are just integers * but may be useful for various algorithms * * fixme: this isn't a terribly *efficient* setup - Vertices don't know about * their neighbors, because the 'edge' class handles that instead. This makes * walking the tree O(n^2) or so, which is crappy. However, this implementation * is *simple* and will do well for small-to-medium graphs, I suspect */ #ifndef _GRAPH_H_ #define _GRAPH_H_ #include using std::list; class Vertex { public: Vertex(int x, int y, int r, int colour = 0, int score = 0); int x; int y; int r; int colour; int score; }; struct Edge { Vertex* a; Vertex* b; int score; }; class Graph { public: Graph(bool planar); virtual ~Graph(); list get_vertices() const { return vertices; } list get_edges() const { return edges; } list get_colour(int colour); list get_vertex_edges(Vertex* v); bool point_in_vertex(int x, int y, int size); Vertex * vertex_at(int x, int y); virtual bool add_vertex(int x, int y, int r, int colour = 0, int score = 0, Vertex* src=NULL); bool is_planar() const { return planar; } void set_planar(bool planar) { this->planar = planar; } protected: list vertices; list edges; private: bool vertex_would_overlap(int x, int y, int r); bool crosses_edge(Edge e); bool planar; }; #endif