r261: Use explicit std:: namespace
[ctsim.git] / include / ezplot.h
index 26a4c34c09ae15e4bdfb94633c6df8233c2c4d76..31291bd617872d2b6c7c77313515fdb08306ff6c 100644 (file)
@@ -1,12 +1,13 @@
 /*****************************************************************************
+** FILE IDENTIFICATION
+**
+**         Name:  ezplot.h
+**         Purpose: Header file for EZplot library
+**
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: ezplot.h,v 1.2 2000/04/28 14:14:16 kevin Exp $
-**  $Log: ezplot.h,v $
-**  Revision 1.2  2000/04/28 14:14:16  kevin
-**  *** empty log message ***
-**
+**  $Id: ezplot.h,v 1.18 2000/12/16 06:12:47 kevin Exp $
 **
 **  This program is free software; you can redistribute it and/or modify
 **  it under the terms of the GNU General Public License (version 2) as
 **  along with this program; if not, write to the Free Software
 **  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 ******************************************************************************/
-/*----------------------------------------------------------------------*/
-/*                             EZPLOT                                  */
-/*                                                                     */
-/*----------------------------------------------------------------------*/
+
 
 #ifndef __H_EZPLOT
 #define __H_EZPLOT
 
-#include <stdio.h>
+#include <cstdio>
+#include <cctype>
+#include <cmath>
 #include <stddef.h>
-#include "kstddef.h"
-#include <ctype.h>
+#include "ctsupport.h"
 #include "sgp.h"
-#include <math.h>
-#include "kmath.h"
-#include "cio.h"
-
-#define MAXLABEL  40           /* maximum length of axis label */
-#define MAXTITLE  40           /* maximum length of a title */
-#define MAXLEGEND 20           /* maximum length of a legend */
-#define MAXCURVES 10           /* maximum number of curves that can be plotted */
-#define MAXPTS    200          /* max number of points that can be read with
-                                  DATA command in INTERACTIVE mode */
-
-struct ezp_curve_st {
-       int numpts;
-       double *x, *y;
-       int linestyle;
-       int symbol;
-       int symfreq;
-       int color;
-       char legend[MAXLEGEND+1];
+
+
+class EZPlotCurve {
+ public:
+    double *x;
+    double *y;
+    int m_iPointCount;
+    int m_iLineStyle;
+    int m_iSymbol;
+    int m_iSymbolFreq;
+    int m_iColor;
+    std::string m_sLegend;
+
+    EZPlotCurve (const double* x, const double* y, int n, int color, int linestyle, int symbol, int sumbolFreq, const std::string& legend);
+
+    ~EZPlotCurve();
 };
 
-#define XBUF_DEF     600
-#define YBUF_DEF     XBUF_DEF * (72. / 120.) * 0.75
-#define PRTMODE_DEF  1
+//----------------------------------------------------------------------
+//                            GLOBAL VARIABLES                         
+//----------------------------------------------------------------------
+
+// axis definitions 
+#define LINEAR 1               // linear axis 
+#define LOG    2               // logrithmic axis 
+#define NOAXIS 3               // don't plot axis 
 
-/*----------------------------------------------------------------------*/
-/*                     Codes from LEX                                  */
-/*----------------------------------------------------------------------*/
+// tick definitions 
+#define ABOVE   1
+#define BELOW   2
+#define RIGHT   4
+#define LEFT    8
+
+// line types 
+#define NOLINE 0
+#define SOLID  1
+#define DASH   2
+#define DASH1  10
+#define DASH2  11
+#define DASH3  12
+#define DASH4  13
+
+// symbol definitions 
+#define SB_CROSS    1
+#define SB_PLUS            2
+#define SB_BOX     3
+#define SB_CIRCLE   4
+#define SB_ERRORBAR 5
+#define MAXSYMBOL   5
+
+#define INSIDE   1             // values of o_legendbox 
+#define OUTSIDE  2
+#define NOLEGEND 3
+
+/*-----------------------------------------------------------------------------
+ *                             GLOBAL VARIABLES
+ *
+ * Naming Convention:
+ *     i_   Internal variable
+ *             Not user changable
+ *     o_   Option variable
+ *             Normal variable that is user modifiable
+ *             These variables must always have a valid value
+ *     d_   Device variable
+ *             Variables controlling devices
+ *      clr_ Color variable
+ *             Holds a color value
+ *     c_   Character string variable
+ *             Contains a character string
+ *     v_   Value variable
+ *             User modifiable variable associated with the set variable (s_)
+ *             These variables do not always have a valid value
+ *             These variables change assumption EZPLOT makes about the plot
+ *     s_   Set variable.
+ *             TRUE if associated value variable (v_) has been set by the user
+ *---------------------------------------------------------------------------*/
+
+#include <vector>
+
+typedef std::vector<EZPlotCurve*>::iterator EZPlotCurveIterator;
+typedef std::vector<EZPlotCurve*>::const_iterator EZPlotCurveConstIterator;
+
+class SGP;
+class EZPlot {
+ private:
+        std::vector<class EZPlotCurve*> m_vecCurves;
+
+    // Colors
+    int clr_axis;                      // color of all axis lines 
+    int clr_title;                     // color of main title 
+    int clr_label;                     // color of axis labels 
+    int clr_legend;                    // color of legend box 
+    int clr_grid;                      // color of grid lines 
+    int clr_number;                    // color of axis number labels 
+
+    // Options
+    double o_xporigin, o_yporigin;     // origin of plot frame in NDC 
+    double o_xlength, o_ylength;       // length of plot frame in NDC 
+
+    std::string c_xlabel;      // label for x axis 
+    std::string c_ylabel;      // label for y axis 
+    std::string c_title;               // title to print above graph 
+    std::string c_legend;;     // current legend specified 
+    
+    int o_linestyle, o_color;  // style to use for curves all subsequent curves to EZPLOT 
+    int o_xaxis, o_yaxis;              // Specifies where axis & labels are drawn 
+    bool o_grid;                       // Flag to draw a grid at major ticks 
+    bool o_box;                        // Flag to draw a box around the graph 
+    
+    int o_xticks, o_yticks;            // direction to draw tick marks 
+    bool o_xtlabel, o_ytlabel; // TRUE if label tick marks 
+    
+    int o_xmajortick, o_ymajortick;    // number of major ticks to draw 
+    int o_xminortick, o_yminortick;    // number of minor ticks between major ticks 
+    
+    int o_symbol;                      // Symbol type, (0 = no symbol) 
+    int o_symfreq;                     // frequency to draw symbols at curve points 
+    
+    int o_legendbox;           // controls whether legend is inside or outside of the axis extents 
+    int o_tag;                 // controls whether to draw tag at end of axes 
+
+    // VALUE & SET variables 
+    double v_xmin, v_xmax, v_ymin, v_ymax;     // user supplied axis endpoints 
+    bool   s_xmin, s_xmax, s_ymin, s_ymax;     // TRUE is endpoint has been set 
+    double v_xtitle, v_ytitle; // NDC position to plot title 
+    bool   s_xtitle, s_ytitle; // TRUE if set position for title 
+    double v_xcross, v_ycross; // position that axes cross 
+    bool   s_xcross, s_ycross; // TRUE if set axes cross position 
+    double v_xlegend, v_ylegend;       // upper-left position of legend box in NDC 
+    bool   s_xlegend, s_ylegend;       // TRUE if set position of legend box 
+    int  v_lxfrac, v_lyfrac;   // number of digits to right of decimal place 
+    bool s_lxfrac, s_lyfrac;   // TRUE if set number of fractional digits 
+    double v_textsize;         // size of text in NDC 
+    bool   s_textsize;         // TRUE if user set size of text 
+
+    // Global variables
+    double charheight; // Height of characters in NDC 
+    double charwidth;  // Height of characters in NDC 
+    double  xp_min, xp_max, yp_min, yp_max;    // boundry of plot frame in NDC 
+    double  xa_min, xa_max, ya_min, ya_max;    // extent of axes in NDC 
+    double  xgw_min, xgw_max, ygw_min, ygw_max;        // boundary of graph in input coords 
+    double  xgn_min, xgn_max, ygn_min, ygn_max;        // boundy of graph in NDC 
+    double xt_min, xt_max, yt_min, yt_max;     // boundary of axis ticks 
+    double  xl_min, xl_max, yl_min, yl_max;    // boundary of legend box 
+    double title_row;  // y-coord of title row 
+    double xtl_ofs;            // Offset y-coord of x tick labels from axis 
+    double ytl_ofs;            // Offset x-coord of y tick labels from axis 
+    double xlbl_row;   // row of x label in world coord 
+    double ylbl_col;   // column of y label in world coord 
+    double xw_tickinc, yw_tickinc;     // increment between major ticks in WC 
+    double xn_tickinc, yn_tickinc;     // increment between major ticks in NDC 
+    int x_nint, y_nint;        // number of intervals along x & y axes 
+    int x_fldwid, x_frac;      // numeric field sizes & number of digits   
+    int y_fldwid, y_frac;      // in fraction of number, used for printf() 
+    double xtl_wid, ytl_wid;   // length of ticks labels in NDC 
+    double tl_height;  // height of tick labels in NDC 
+    char x_numfmt[20]; // format to print x tick labels 
+    char y_numfmt[20]; // format to print y tick labels 
+
+    double m_dVP_xmin, m_dVP_ymin;
+    double m_dVP_xmax, m_dVP_ymax;
+    double m_dVP_xscale, m_dVP_yscale;
+    double m_xWorldScale, m_yWorldScale;
+
+    void drawAxes(void);
+    void symbol (int sym, double symwidth, double symheight);
+    void make_numfmt(char *fmtstr, int *fldwid, int *nfrac, double min, double max, int nint);
+    int axis_scale (double min, double max, int nint, double *minp, double *maxp, int *nintp);
+
+    SGP& rSGP;
+
+    void clearCurves ();
+
+    bool ezcmd (char *comm);
+    bool do_cmd(int lx);
+    void bad_option(char *opt);
+    void initPlotSettings();
+
+    static void initkw(void);
+    
+    static bool ezset_initialized;
+
+    double convertWorldToNDC_X (double x)
+       { return xgn_min + (x - xgw_min) * m_xWorldScale; }
+
+    double convertWorldToNDC_Y (double y)
+       { return ygn_min + (y - ygw_min) * m_yWorldScale; }
+
+ public:
+    EZPlot (SGP& sgp);
+    ~EZPlot ();
+
+    int ezset (char *command);
+
+    void addCurve (const float* x, const double* y, int num);
+    void addCurve (const double* x, const float* y, int num);
+    void addCurve (const double* x, const double* y, int num);
+    void addCurve (const double* y, int n);
+    void addCurve (const float* y, int n);
+
+    void plot ();
+};     
+
+//----------------------------------------------------------------------
+//                     Codes from LEX                                  
+//----------------------------------------------------------------------
 
 #define S_DATA         2
 #define S_HELP         3
@@ -78,9 +255,6 @@ struct ezp_curve_st {
 #define S_SYMBOL       -18     
 #define S_EVERY                -19
 #define S_NONE         -20
-#define S_CURVES       -21
-#define S_UNKNOWN      -22
-#define S_END          -23
 #define S_LEGEND       -24
 #define S_XLEGEND      -25
 #define S_YLEGEND      -26
@@ -121,8 +295,6 @@ struct ezp_curve_st {
 #define S_CLEAR                -61
 #define S_STORE                -62
 #define S_RESTORE      -63
-#define S_USTART       -64
-#define S_UFINISH      -65
 #define S_AMARK                -66
 #define S_NO           -67
 #define S_INTERACTIVE  -68
@@ -140,195 +312,7 @@ struct ezp_curve_st {
 #define S_LEGENDBOX    -107
 #define S_TAG          -108
 
-#define S_EPSON                -110
-#define S_CRT          -111
-
 #define S_TEXTSIZE     -120
-#define S_XBUF         -121
-#define S_YBUF         -122
-#define S_PRTMODE      -123
-
-/*----------------------------------------------------------------------*/
-/*                            GLOBAL VARIABLES                         */
-/*----------------------------------------------------------------------*/
-
-/* axis definitions */
-#define LINEAR 1               /* linear axis */
-#define LOG    2               /* logrithmic axis */
-#define NOAXIS 3               /* don't plot axis */
-
-/* tick definitions */
-#define ABOVE   1
-#define BELOW   2
-#define RIGHT   4
-#define LEFT    8
-
-/* line types */
-#define NOLINE 0
-#define SOLID  1
-#define DASH   2
-#define DASH1  10
-#define DASH2  11
-#define DASH3  12
-#define DASH4  13
-
-/* symbol definitions */
-#define SB_CROSS    1
-#define SB_PLUS            2
-#define SB_BOX     3
-#define SB_CIRCLE   4
-#define SB_ERRORBAR 5
-#define MAXSYMBOL   5
-
-#define INSIDE   1             /* values of o_legendbox */
-#define OUTSIDE  2
-#define NOLEGEND 3
-
-/*-----------------------------------------------------------------------------
- *                             GLOBAL VARIABLES
- *
- * Naming Convention:
- *     i_   Internal variable
- *             Not user changable
- *     o_   Option variable
- *             Normal variable that is user modifiable
- *             These variables must always have a valid value
- *     d_   Device variable
- *             Variables controlling devices
- *      clr_ Color variable
- *             Holds a color value
- *     c_   Character string variable
- *             Contains a character string
- *     v_   Value variable
- *             User modifiable variable associated with the set variable (s_)
- *             These variables do not always have a valid value
- *             These variables change assumption EZPLOT makes about the plot
- *     s_   Set variable.
- *             TRUE if associated value variable (v_) has been set by the user
- *---------------------------------------------------------------------------*/
-
-
-struct ezplot_var {
-
-/*-------------*/
-/* USER CURVES */
-/*-------------*/
-
-struct ezp_curve_st curve[MAXCURVES];
-
-/*--------------------*/
-/* INTERNAL VARIABLES */
-/*--------------------*/
-
-bool i_plotimmediate;          /* indicates that a call to EZPLOT is a signal
-                                  to print all received arrays.  EZSET uses
-                                  this variable to force EZPLOT to replot 
-                                  its stored curves */
-int i_numcurves;               /* number of curves received by EZPLOT */
-
-/*------------------*/
-/* DEVICE VARIABLES */
-/*------------------*/
-
-bool d_usecrt;                 /* TRUE if want to use CRT as output device */ 
-bool d_useprt;                 /* TRUE if wamt to use printer as output device */
-
-int d_crtmode;                 /* Controls which crt mode to use for plot */
-int d_prtmode;                 /* Controls mode of printer output */
-
-int d_xprtbuf, d_yprtbuf;      /* Size of printer buffer in pixels */
-
-/*-----------------*/
-/* COLOR VARIABLES */
-/*-----------------*/
-
-int clr_axis;                  /* color of all axis lines */
-int clr_title;                 /* color of main title */
-int clr_label;                 /* color of axis labels */
-int clr_legend;                        /* color of legend box */
-int clr_grid;                  /* color of grid lines */
-int clr_number;                        /* color of axis number labels */
-
-/*------------------*/
-/* OPTION VARIABLES */
-/*------------------*/
-
-int o_reqcurves;               /* # of curves specified in CURVES command */
-                               /* default value is 1, so that a call to EZPLOT
-                                  will force a plot */
-bool o_unknowncurves;          /* TRUE when the user specifies that the 
-                                  number of curves is unknown */
-
-bool o_ustart, o_ufinish;      /* TRUE if user initiates or terminate sgp */
-
-double o_xporigin, o_yporigin; /* origin of plot frame in NDC */
-double o_xlength, o_ylength;   /* length of plot frame in NDC */
-
-char c_xlabel[MAXLABEL+1];     /* label for x axis */
-char c_ylabel[MAXLABEL+1];     /* label for y axis */
-char c_title[MAXTITLE+1];              /* title to print above graph */
-char c_legend[MAXLEGEND+1];    /* current legend specified */
-
-int o_linestyle, o_color;      /* style to use for curves all subsequent */
-                               /* curves to EZPLOT */
-bool o_xaxis, o_yaxis;         /* Specifies where axis & labels are drawn */
-bool o_grid;                   /* Flag to draw a grid at major ticks */
-bool o_box;                    /* Flag to draw a box around the graph */
-
-int o_xticks, o_yticks;                /* direction to draw tick marks */
-bool o_xtlabel, o_ytlabel;     /* TRUE if label tick marks */
-
-int o_xmajortick, o_ymajortick;        /* number of major ticks to draw */
-int o_xminortick, o_yminortick;        /* number of minor ticks between major ticks */
-
-int o_symbol;                  /* Symbol type, (0 = no symbol) */
-int o_symfreq;                 /* frequency to draw symbols at curve points */
-
-int o_legendbox;               /* controls whether legend is inside */
-                               /* or outside of the axis extents */
-int o_tag;                     /* controls whether to draw tag at end of axes */
-
-/*-----------------------*/
-/* VALUE & SET variables */
-/*-----------------------*/
-
-double v_xmin, v_xmax, v_ymin, v_ymax; /* user supplied axis endpoints */
-bool   s_xmin, s_xmax, s_ymin, s_ymax; /* TRUE is endpoint has been set */
-
-double v_xtitle, v_ytitle;     /* NDC position to plot title */
-bool   s_xtitle, s_ytitle;     /* TRUE if set position for title */
-double v_xcross, v_ycross;     /* position that axes cross */
-bool   s_xcross, s_ycross;     /* TRUE if set axes cross position */
-
-double v_xlegend, v_ylegend;   /* upper-left position of legend box in NDC */
-bool   s_xlegend, s_ylegend;   /* TRUE if set position of legend box */
-
-int  v_lxfrac, v_lyfrac;       /* number of digits to right of decimal place */
-bool s_lxfrac, s_lyfrac;       /* TRUE if set number of fractional digits */
-
-double v_textsize;             /* size of text in NDC */
-bool   s_textsize;             /* TRUE if user set size of text */
-
-};     /* end of EZPLOT VARIABLES */
-
-
-
-extern struct ezplot_var ez;
-extern bool ezplot_firstcall;   /* set to false on first call to EZSET or EZPLOT */
-
 
-/* axis.c */
-int axis_scale(double min, double max, int nint, double *minp, double *maxp, int *nintp);
-/* ezplot.c */
-int ezplot(double x[], double y[], int num);
-void ezinit(void);
-void ezfree(void);
-void ezclear(void);
-/* ezplot1d.c */
-void ezplot_1d(double *y, int n);
-/* ezset.c */
-int ezset(char *command);
-/* makefmt.c */
-void make_numfmt(char *fmtstr, int *fldwid, int *nfrac, double min, double max, int nint);
 
 #endif