3 #include<lemon/list_graph.h>
18 Color(double r,double g,double b) :_r(r),_g(g),_b(b) {};
20 double getR() {return _r;}
22 double getG() {return _g;}
24 double getB() {return _b;}
26 void set(double r,double g,double b) { _r=r;_g=g;_b=b; };
31 struct DefaultGraphToEpsTraits
34 typedef typename Graph::Node Node;
35 typedef typename Graph::NodeIt NodeIt;
36 typedef typename Graph::Edge Edge;
37 typedef typename Graph::EdgeIt EdgeIt;
38 typedef typename Graph::InEdgeIt InEdgeIt;
39 typedef typename Graph::OutEdgeIt OutEdgeIt;
43 ConstMap<typename Graph::Node,xy<double> > coords;
44 ConstMap<typename Graph::Node,double > nodeSizes;
46 ConstMap<typename Graph::Node,Color > nodeColors;
47 ConstMap<typename Graph::Edge,Color > edgeColors;
48 double nodeSizeScalar;
49 double xBorder, yBorder;
51 DefaultGraphToEpsTraits(G &_g) :
52 g(_g), coords(xy<double>(1,1)), nodeSizes(1.0),
53 nodeColors(Color(1,1,1)), edgeColors(Color(0,0,0)),
54 nodeSizeScalar(1.0), xBorder(10), yBorder(10) {}
58 template<class T> class GraphToEps : public T
60 typedef typename T::Graph Graph;
61 typedef typename Graph::Node Node;
62 typedef typename Graph::NodeIt NodeIt;
63 typedef typename Graph::Edge Edge;
64 typedef typename Graph::EdgeIt EdgeIt;
65 typedef typename Graph::InEdgeIt InEdgeIt;
66 typedef typename Graph::OutEdgeIt OutEdgeIt;
71 GraphToEps(const T &t) : T(t), dontPrint(false) {};
73 template<class X> struct SetCoordsTraits : public T {
75 SetCoordsTraits(const T &t,const X &x) : T(t), coords(x) {}
78 template<class X> GraphToEps<SetCoordsTraits<X> > setCoords(const X &x) {
80 return GraphToEps<SetCoordsTraits<X> >(SetCoordsTraits<X>(*this,x));
82 template<class X> struct SetNodeSizesTraits : public T {
84 SetNodeSizesTraits(const T &t,const X &x) : T(t), nodeSizes(x) {}
87 template<class X> GraphToEps<SetNodeSizesTraits<X> > setNodeSizes(const X &x)
90 return GraphToEps<SetNodeSizesTraits<X> >(SetNodeSizesTraits<X>(*this,x));
92 template<class X> struct SetNodeColorsTraits : public T {
94 SetNodeColorsTraits(const T &t,const X &x) : T(t), nodeColors(x) {}
97 template<class X> GraphToEps<SetNodeColorsTraits<X> >
98 setNodeColors(const X &x)
101 return GraphToEps<SetNodeColorsTraits<X> >(SetNodeColorsTraits<X>(*this,x));
103 template<class X> struct SetEdgeColorsTraits : public T {
105 SetEdgeColorsTraits(const T &t,const X &x) : T(t), edgeColors(x) {}
108 template<class X> GraphToEps<SetEdgeColorsTraits<X> >
109 setEdgeColors(const X &x)
112 return GraphToEps<SetEdgeColorsTraits<X> >(SetEdgeColorsTraits<X>(*this,x));
115 GraphToEps<T> &scaleNodeSize(double d) {nodeSizeScalar=d;return *this;}
119 if(dontPrint) return;
121 cout << "%!PS-Adobe-2.0 EPSF-2.0\n";
122 //\todo: Chech whether the graph is empty.
123 BoundingBox<double> bb;
127 xy<double> p(nodeSizes[n]*nodeSizeScalar,nodeSizes[n]*nodeSizeScalar);
131 cout << "%%BoundingBox: "
132 << bb.left()-xBorder << ' ' << bb.bottom()-yBorder << ' '
133 << bb.right()+xBorder << ' ' << bb.top()+yBorder << '\n';
134 //x1 y1 x2 y2 cr cg cb
135 cout << "/l { setrgbcolor newpath moveto lineto stroke } bind def\n";
136 cout << "/c { newpath dup 3 index add 2 index moveto 0 360 arc } bind def\n";
138 cout << "/n { setrgbcolor 2 index 2 index 2 index c fill\n"
139 << " 0 0 0 setrgbcolor dup 10 div setlinewidth c stroke\n"
142 cout << "%Edges:\ngsave\n";
143 for(NodeIt n(g);n!=INVALID;++n)
144 for(OutEdgeIt e(g,n);e!=INVALID;++e)
145 cout << coords[g.source(e)].x << ' ' << coords[g.source(e)].y << ' '
146 << coords[g.target(e)].x << ' ' << coords[g.target(e)].y << ' '
147 << edgeColors[e].getR() << ' '
148 << edgeColors[e].getG() << ' '
149 << edgeColors[e].getB() << " l\n";
150 cout << "grestore\n%Nodes:\ngsave\n";
151 for(NodeIt n(g);n!=INVALID;++n)
152 cout << coords[n].x << ' ' << coords[n].y << ' '
153 << nodeSizes[n]*nodeSizeScalar << ' '
154 << nodeColors[n].getR() << ' '
155 << nodeColors[n].getG() << ' '
156 << nodeColors[n].getB() << " n\n";
157 cout << "grestore\n";
163 GraphToEps<DefaultGraphToEpsTraits<G> > graphToEps(G &g)
165 return GraphToEps<DefaultGraphToEpsTraits<G> >(DefaultGraphToEpsTraits<G>(g));
170 using namespace lemon;
172 class ColorSet : public MapBase<int,Color>
175 Color operator[](int i) const
178 case 0: return Color(0,0,0);
179 case 1: return Color(1,0,0);
180 case 2: return Color(0,1,0);
181 case 3: return Color(0,0,1);
182 case 4: return Color(1,1,0);
183 case 5: return Color(1,0,1);
184 case 6: return Color(0,1,1);
185 case 7: return Color(1,1,1);
194 typedef ListGraph::Node Node;
195 typedef ListGraph::NodeIt NodeIt;
196 typedef ListGraph::Edge Edge;
197 typedef xy<double> Xy;
205 ListGraph::NodeMap<Xy> coords(g);
206 ListGraph::NodeMap<double> sizes(g);
207 ListGraph::NodeMap<int> colors(g);
208 ListGraph::EdgeMap<int> ecolors(g);
210 coords[n1]=Xy(50,50); sizes[n1]=1; colors[n1]=1;
211 coords[n2]=Xy(50,70); sizes[n2]=2; colors[n2]=2;
212 coords[n3]=Xy(70,70); sizes[n3]=1; colors[n3]=3;
213 coords[n4]=Xy(70,50); sizes[n4]=2; colors[n4]=4;
214 coords[n5]=Xy(85,60); sizes[n5]=3; colors[n5]=5;
218 e=g.addEdge(n1,n2); ecolors[e]=0;
219 e=g.addEdge(n2,n3); ecolors[e]=0;
220 e=g.addEdge(n3,n5); ecolors[e]=0;
221 e=g.addEdge(n5,n4); ecolors[e]=0;
222 e=g.addEdge(n4,n1); ecolors[e]=0;
223 e=g.addEdge(n2,n4); ecolors[e]=1;
224 e=g.addEdge(n3,n4); ecolors[e]=2;
226 graphToEps(g).setCoords(coords).
227 scaleNodeSize(2).setNodeSizes(sizes).
228 setNodeColors(composeMap(colorSet,colors)).
229 setEdgeColors(composeMap(colorSet,ecolors));