lemon/eps.h
author alpar
Tue, 21 Feb 2006 12:37:00 +0000
changeset 1977 8ef02f0c4245
child 2008 0820d8168cbb
permissions -rw-r--r--
RefPtr: a reference counted pointer class
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_EPS_H
    20 #define LEMON_EPS_H
    21 
    22 #include<string>
    23 #include<iostream>
    24 #include<fstream>
    25 #include<sstream>
    26 #include<lemon/color.h>
    27 #include<lemon/xy.h>
    28 
    29   ///\ingroup io_group
    30   ///\file
    31   ///\brief Simple tool to create \c .eps files
    32   ///
    33   ///\author Alpar Juttner
    34 
    35 namespace lemon {
    36   
    37   ///\ingroup io_group
    38   ///\brief A simple tool to create \c .eps files
    39   ///
    40   ///A simple tool to create \c .eps files
    41   ///\author Alpar Juttner
    42   class EpsDrawer
    43   {
    44     void defMacros();
    45     void init(int x1,int y1,int x2,int y2);
    46     void init(double x1,double y1,double x2,double y2);
    47     bool local_stream;
    48   public:
    49     
    50     std::ostream &out;
    51     
    52     ///\e 
    53 
    54     ///The generated file is put to \c os.
    55     ///
    56     /// \c x and \c y determine the upper
    57     ///right corner of the bounding box. The lower left corner is (0,0).
    58     EpsDrawer(std::ostream &os,int x,int y);
    59     ///\e
    60 
    61     ///The generated file is put to \c os.
    62     ///
    63     ///(x1,y1) and (x2,y2)
    64     /// determine the lower left and the upper right corners of
    65     ///the bounding box, respectively.
    66     EpsDrawer(std::ostream &os,int x1,int y1,int x2,int y2);
    67     ///\e
    68 
    69     ///The generated file is put to \c os.
    70     ///
    71     ///\c s determines the upper
    72     ///right corner of the bounding box. The lower left corner is (0,0).
    73     EpsDrawer(std::ostream &os,xy<double> s);
    74     ///\e
    75 
    76     ///The generated file is put to \c os.
    77     ///
    78     ///\c a and \c b
    79     /// determine the lower left and the upper right corners of
    80     ///the bounding box, respectively.
    81     EpsDrawer(std::ostream &os,xy<double> a, xy<double> b);
    82     ///\e
    83 
    84     ///The generated picture is put to the file \c name.
    85     ///
    86     ///\c x and \c y determine the upper
    87     ///right corner of the bounding box. The lower left corner is (0,0).
    88     EpsDrawer(const std::string &name,int x,int y);
    89     ///\e
    90 
    91     ///The generated picture is put to the file \c name.
    92     ///
    93     ///(x1,y1) and (x2,y2)
    94     /// determine the lower left and the upper right corners of
    95     ///the bounding box, respectively.
    96     EpsDrawer(const std::string &name,int x1,int y1,int x2,int y2);
    97     ///\e
    98 
    99     ///The generated picture is put to the file \c name.
   100     ///
   101     ///\c s determines the upper
   102     ///right corner of the bounding box. The lower left corner is (0,0).
   103     EpsDrawer(const std::string &name,xy<double> s);
   104     ///\e
   105 
   106     ///The generated picture is put to the file \c name.
   107     ///
   108     ///\c a and \c b
   109     /// determine the lower left and the upper right corners of
   110     ///the bounding box, respectively.
   111     EpsDrawer(const std::string &name,xy<double> a, xy<double> b);
   112 
   113 //     template<class T> EpsDrawer(std::ostream &os,BoundingBox<T> b) 
   114 //     template<class T> EpsDrawer(std::ostream &os,BoundingBox<T> b);
   115     
   116     ~EpsDrawer();
   117     
   118     ///Save the current graphic state.
   119 
   120     ///This function saves the current coordinate system, and the parameters
   121     ///set by \ref color(), \ref lineWidth() etc.
   122     ///The can be \ref restore "restore()"d later.
   123     ///
   124     ///The \ref save() - \ref restore() pairs can be nested.
   125     ///
   126     EpsDrawer &save();
   127     ///Restore the saves graphic state.
   128 
   129     EpsDrawer &restore();
   130     
   131     ///Draw a line
   132     EpsDrawer &line(double x1,double y1,double x2,double y2);
   133     ///Draw a line from the current point
   134     EpsDrawer &lineTo(double x1,double y1);
   135     ///Move the current point
   136     EpsDrawer &moveTo(double x1,double y1);
   137     ///Draw a circle
   138     EpsDrawer &circle(double x,double y, double r);
   139     
   140     ///Draw a line
   141     template<class T> EpsDrawer &line(xy<T> p1,xy<T> p2) 
   142     {
   143       return line(p1.x,p1.y,p2.x,p2.y);
   144     }
   145     ///Draw a line from the current point
   146     template<class T> EpsDrawer &lineTo(xy<T> p)
   147     {
   148       return lineTo(p.x,p.y);
   149     }
   150     ///Move the current point
   151     template<class T> EpsDrawer &moveTo(xy<T> p)
   152     {
   153       return moveTo(p.x,p.y);
   154     }
   155     ///Draw a circle
   156     template<class T> EpsDrawer &circle(xy<T> p, double r)
   157     {
   158       return circle(p.x,p.y,r);
   159     }
   160     
   161     ///Set the font size
   162     EpsDrawer &fontSize(double si);
   163     ///Set the fint type
   164     EpsDrawer &font(std::string );
   165     ///Sets whether text output is centerized of not
   166 
   167     ///Sets whether text output is centerized of not.
   168     ///
   169     ///\warning \ref save() doesn't save this setting.
   170     ///
   171     EpsDrawer &centerMode(bool m);
   172     ///Turn to collect mode.
   173 
   174     ///If you call this function, then the drawing operations like \ref line(),
   175     ///\ref lineTo(), \ref moveTo() will not take place immediately, but istead
   176     ///they
   177     ///are collected. These operations form a \e path.
   178     ///Then you can \ref stroke(), \ref fill(), \ref eofill(), \ref clip() or
   179     ///\ref eoclip() it.
   180     ///When drawing, you can also use \ref closePath() to - surprise - close the
   181     ///current path.
   182     ///
   183     ///This example draws a red filled diamond.
   184     ///\code
   185     ///  EpsDraw ed("diamond.eps",-1,-1,1,1);
   186     ///  ed.color(1,0,0,).collect().line(0,-1,1,0).lineTo(0,1)
   187     ///    .lineTo(-1,0).closePath().fill();
   188     ///\endcode
   189     EpsDrawer &collect();
   190     ///Close the current drawing path
   191     EpsDrawer &closePath();
   192     ///Stroke (draw) a path
   193 
   194     ///Stroke (draw) a path.
   195     ///\sa collect
   196     ///
   197     EpsDrawer &stroke();
   198     ///Fill a path
   199 
   200     ///Fill a path.
   201     ///\sa collect
   202     ///
   203     EpsDrawer &fill();
   204     ///Even-odd fill a path
   205 
   206     ///Even-odd fill a path.
   207     ///\sa collect
   208     ///
   209     EpsDrawer &eoFill();
   210     ///Set a clipping area.
   211 
   212     ///This function sets a clipping area. After that, the drawing operations
   213     ///will affect only this area.
   214     ///\sa collect
   215     ///
   216     EpsDrawer &clip();
   217     ///Set a clipping area using even-odd rule.
   218 
   219     ///This function sets a clipping area using even-odd rule.
   220     ///After that, the drawing operations
   221     ///will affect only this area.
   222     ///\sa collect
   223     ///
   224     EpsDrawer &eoClip();
   225     
   226     ///Set the line width.
   227     EpsDrawer &lineWidth(double w);
   228     ///Set the style of the line ends
   229 
   230     ///\param i It can be 0, 1 or 2
   231     ///
   232     EpsDrawer &lineCap(int i);
   233     ///Set the style of the line joins
   234 
   235     ///\param i It can be 0, 1 or 2
   236     ///
   237     EpsDrawer &lineJoin(int i);
   238     ///Set the cut length of near parallel joining lines.
   239     EpsDrawer &miterLimit(double w);
   240     
   241     ///Set the drawing color
   242     EpsDrawer &color(double r, double g, double b);
   243     ///Set the drawing color
   244     EpsDrawer &color(Color c)
   245     {
   246       return color(c.red(),c.green(),c.blue());
   247     }
   248     
   249     ///Translate the coordinate system
   250     EpsDrawer &translate(double x,double y);
   251     ///Translate the coordinate system
   252     template<class T> EpsDrawer &translate(xy<T> p)
   253     {
   254       return translate(p.x,p.y);
   255     }
   256     ///Rotate the coordinate system
   257     EpsDrawer &rotate(double r);
   258     ///Scale the coordinate system
   259     EpsDrawer &scale(double sx, double sy);
   260     ///Scale the coordinate system
   261     EpsDrawer &scale(double s) { return scale(s,s); }
   262     ///Scale the coordinate system
   263     template<class T> EpsDrawer &scale(xy<T> p)
   264     {
   265       return scale(p.x,p.y);
   266     }
   267     
   268     ///\e
   269     EpsDrawer &flush();
   270     ///Clear the image
   271     EpsDrawer &clear();
   272     
   273     ///Print a text at the current point
   274     EpsDrawer &operator<<(const std::string &s);
   275     ///Print a text at the current point
   276     EpsDrawer &operator<<(const char *s);
   277     ///Print a number at the current point
   278     EpsDrawer &operator<<(int i);
   279     ///Print a number at the current point
   280     EpsDrawer &operator<<(double d);
   281     ///Print a coordinate at the current point
   282     template<class T>
   283     EpsDrawer &operator<<(xy<T> p) 
   284     {
   285       out << "((" << p.x << ',' << p.y <<")) show\n";
   286       return *this;
   287     }
   288     
   289   };
   290   
   291 }
   292 
   293 #endif