treewars/graph.h

53 lines
1.5 KiB
C
Raw Normal View History

/* Represents an undirected graph.
* Also contains the vertex class
* 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 "vertex.h"
#include <list>
using std::list;
class Graph
{
public:
Graph(bool planar);
virtual ~Graph();
list<Vertex*> get_vertices() const { return vertices; }
list<Vertex*> get_colour(int colour);
bool point_in_vertex(int x, int y, int z);
Vertex * vertex_at(int x, int y, int z);
virtual bool add_vertex(Vertex* v, Vertex* src=NULL);
void remove_vertex(Vertex* target);
bool is_planar() const { return planar; }
void set_planar(bool planar) { this->planar = planar; }
protected:
list<Vertex*> vertices;
bool crosses_edge(Vertex* a, Vertex* b);
bool vertex_would_overlap(int x, int y, int z, int r);
private:
bool planar;
};
#endif