[Lemon-commits] [lemon_svn] alpar: r1440 - hugo/trunk/src/work/alpar
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:45:28 CET 2006
Author: alpar
Date: Tue Jan 4 18:07:05 2005
New Revision: 1440
Added:
hugo/trunk/src/work/alpar/graph_to_eps.cc
Log:
An experimental graph-to-eps exporter.
Added: hugo/trunk/src/work/alpar/graph_to_eps.cc
==============================================================================
--- (empty file)
+++ hugo/trunk/src/work/alpar/graph_to_eps.cc Tue Jan 4 18:07:05 2005
@@ -0,0 +1,230 @@
+#include<lemon/xy.h>
+#include<lemon/maps.h>
+#include<lemon/list_graph.h>
+
+///\file
+///Simple graph drawer
+
+namespace lemon {
+
+ ///\e
+class Color
+{
+ double _r,_g,_b;
+public:
+ ///\e
+ Color() {}
+ ///\e
+ Color(double r,double g,double b) :_r(r),_g(g),_b(b) {};
+ ///\e
+ double getR() {return _r;}
+ ///\e
+ double getG() {return _g;}
+ ///\e
+ double getB() {return _b;}
+ ///\e
+ void set(double r,double g,double b) { _r=r;_g=g;_b=b; };
+};
+
+ ///\e
+template<class G>
+struct DefaultGraphToEpsTraits
+{
+ typedef G Graph;
+ typedef typename Graph::Node Node;
+ typedef typename Graph::NodeIt NodeIt;
+ typedef typename Graph::Edge Edge;
+ typedef typename Graph::EdgeIt EdgeIt;
+ typedef typename Graph::InEdgeIt InEdgeIt;
+ typedef typename Graph::OutEdgeIt OutEdgeIt;
+
+
+ const Graph &g;
+ ConstMap<typename Graph::Node,xy<double> > coords;
+ ConstMap<typename Graph::Node,double > nodeSizes;
+
+ ConstMap<typename Graph::Node,Color > nodeColors;
+ ConstMap<typename Graph::Edge,Color > edgeColors;
+ double nodeSizeScalar;
+ double xBorder, yBorder;
+
+ DefaultGraphToEpsTraits(G &_g) :
+ g(_g), coords(xy<double>(1,1)), nodeSizes(1.0),
+ nodeColors(Color(1,1,1)), edgeColors(Color(0,0,0)),
+ nodeSizeScalar(1.0), xBorder(10), yBorder(10) {}
+};
+
+ ///\e
+template<class T> class GraphToEps : public T
+{
+ typedef typename T::Graph Graph;
+ typedef typename Graph::Node Node;
+ typedef typename Graph::NodeIt NodeIt;
+ typedef typename Graph::Edge Edge;
+ typedef typename Graph::EdgeIt EdgeIt;
+ typedef typename Graph::InEdgeIt InEdgeIt;
+ typedef typename Graph::OutEdgeIt OutEdgeIt;
+
+ bool dontPrint;
+
+public:
+ GraphToEps(const T &t) : T(t), dontPrint(false) {};
+
+ template<class X> struct SetCoordsTraits : public T {
+ const X &coords;
+ SetCoordsTraits(const T &t,const X &x) : T(t), coords(x) {}
+ };
+ ///\e
+ template<class X> GraphToEps<SetCoordsTraits<X> > setCoords(const X &x) {
+ dontPrint=true;
+ return GraphToEps<SetCoordsTraits<X> >(SetCoordsTraits<X>(*this,x));
+ }
+ template<class X> struct SetNodeSizesTraits : public T {
+ const X &nodeSizes;
+ SetNodeSizesTraits(const T &t,const X &x) : T(t), nodeSizes(x) {}
+ };
+ ///\e
+ template<class X> GraphToEps<SetNodeSizesTraits<X> > setNodeSizes(const X &x)
+ {
+ dontPrint=true;
+ return GraphToEps<SetNodeSizesTraits<X> >(SetNodeSizesTraits<X>(*this,x));
+ }
+ template<class X> struct SetNodeColorsTraits : public T {
+ const X &nodeColors;
+ SetNodeColorsTraits(const T &t,const X &x) : T(t), nodeColors(x) {}
+ };
+ ///\e
+ template<class X> GraphToEps<SetNodeColorsTraits<X> >
+ setNodeColors(const X &x)
+ {
+ dontPrint=true;
+ return GraphToEps<SetNodeColorsTraits<X> >(SetNodeColorsTraits<X>(*this,x));
+ }
+ template<class X> struct SetEdgeColorsTraits : public T {
+ const X &edgeColors;
+ SetEdgeColorsTraits(const T &t,const X &x) : T(t), edgeColors(x) {}
+ };
+ ///\e
+ template<class X> GraphToEps<SetEdgeColorsTraits<X> >
+ setEdgeColors(const X &x)
+ {
+ dontPrint=true;
+ return GraphToEps<SetEdgeColorsTraits<X> >(SetEdgeColorsTraits<X>(*this,x));
+ }
+ ///\e
+ GraphToEps<T> &scaleNodeSize(double d) {nodeSizeScalar=d;return *this;}
+
+ ~GraphToEps()
+ {
+ if(dontPrint) return;
+
+ cout << "%!PS-Adobe-2.0 EPSF-2.0\n";
+ //\todo: Chech whether the graph is empty.
+ BoundingBox<double> bb;
+ for(NodeIt n(g);
+ n!=INVALID;
+ ++n) {
+ xy<double> p(nodeSizes[n]*nodeSizeScalar,nodeSizes[n]*nodeSizeScalar);
+ bb+=coords[n]+p;
+ bb+=coords[n]-p;
+ }
+ cout << "%%BoundingBox: "
+ << bb.left()-xBorder << ' ' << bb.bottom()-yBorder << ' '
+ << bb.right()+xBorder << ' ' << bb.top()+yBorder << '\n';
+ //x1 y1 x2 y2 cr cg cb
+ cout << "/l { setrgbcolor newpath moveto lineto stroke } bind def\n";
+ cout << "/c { newpath dup 3 index add 2 index moveto 0 360 arc } bind def\n";
+ // x y r cr cg cb
+ cout << "/n { setrgbcolor 2 index 2 index 2 index c fill\n"
+ << " 0 0 0 setrgbcolor dup 10 div setlinewidth c stroke\n"
+ << " } bind def\n";
+
+ cout << "%Edges:\ngsave\n";
+ for(NodeIt n(g);n!=INVALID;++n)
+ for(OutEdgeIt e(g,n);e!=INVALID;++e)
+ cout << coords[g.source(e)].x << ' ' << coords[g.source(e)].y << ' '
+ << coords[g.target(e)].x << ' ' << coords[g.target(e)].y << ' '
+ << edgeColors[e].getR() << ' '
+ << edgeColors[e].getG() << ' '
+ << edgeColors[e].getB() << " l\n";
+ cout << "grestore\n%Nodes:\ngsave\n";
+ for(NodeIt n(g);n!=INVALID;++n)
+ cout << coords[n].x << ' ' << coords[n].y << ' '
+ << nodeSizes[n]*nodeSizeScalar << ' '
+ << nodeColors[n].getR() << ' '
+ << nodeColors[n].getG() << ' '
+ << nodeColors[n].getB() << " n\n";
+ cout << "grestore\n";
+ }
+};
+
+
+template<class G>
+GraphToEps<DefaultGraphToEpsTraits<G> > graphToEps(G &g)
+{
+ return GraphToEps<DefaultGraphToEpsTraits<G> >(DefaultGraphToEpsTraits<G>(g));
+}
+
+}
+
+using namespace lemon;
+
+class ColorSet : public MapBase<int,Color>
+{
+public:
+ Color operator[](int i) const
+ {
+ switch(i%8){
+ case 0: return Color(0,0,0);
+ case 1: return Color(1,0,0);
+ case 2: return Color(0,1,0);
+ case 3: return Color(0,0,1);
+ case 4: return Color(1,1,0);
+ case 5: return Color(1,0,1);
+ case 6: return Color(0,1,1);
+ case 7: return Color(1,1,1);
+ }
+ return Color(0,0,0);
+ }
+} colorSet;
+
+int main()
+{
+ ListGraph g;
+ typedef ListGraph::Node Node;
+ typedef ListGraph::NodeIt NodeIt;
+ typedef ListGraph::Edge Edge;
+ typedef xy<double> Xy;
+
+ Node n1=g.addNode();
+ Node n2=g.addNode();
+ Node n3=g.addNode();
+ Node n4=g.addNode();
+ Node n5=g.addNode();
+
+ ListGraph::NodeMap<Xy> coords(g);
+ ListGraph::NodeMap<double> sizes(g);
+ ListGraph::NodeMap<int> colors(g);
+ ListGraph::EdgeMap<int> ecolors(g,0);
+
+ coords[n1]=Xy(50,50); sizes[n1]=1; colors[n1]=1;
+ coords[n2]=Xy(50,70); sizes[n2]=2; colors[n2]=2;
+ coords[n3]=Xy(70,70); sizes[n3]=1; colors[n3]=3;
+ coords[n4]=Xy(70,50); sizes[n4]=2; colors[n4]=4;
+ coords[n5]=Xy(85,60); sizes[n5]=3; colors[n5]=5;
+
+ Edge e;
+
+ e=g.addEdge(n1,n2);
+ e=g.addEdge(n2,n3);
+ e=g.addEdge(n3,n5);
+ e=g.addEdge(n5,n4);
+ e=g.addEdge(n4,n1);
+ e=g.addEdge(n2,n4); ecolors[e]=1;
+ e=g.addEdge(n3,n4); ecolors[e]=2;
+
+ graphToEps(g).setCoords(coords).
+ scaleNodeSize(2).setNodeSizes(sizes).
+ setNodeColors(composeMap(colorSet,colors)).
+ setEdgeColors(composeMap(colorSet,ecolors));
+}
More information about the Lemon-commits
mailing list