r186: *** empty log message ***
[ctsim.git] / include / ezplot.h
index c5838c0a5bec1b765cc79d0e55e2d1e1527c82fe..716fd3e2b361c8946448a7ecb5ea12d5edcbac6c 100644 (file)
-/*----------------------------------------------------------------------*/
-/*                             EZPLOT                                  */
-/*                                                                     */
-/*----------------------------------------------------------------------*/
+/*****************************************************************************
+** 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.13 2000/08/31 08:38:58 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
+**  published by the Free Software Foundation.
+**
+**  This program is distributed in the hope that it will be useful,
+**  but WITHOUT ANY WARRANTY; without even the implied warranty of
+**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+**  GNU General Public License for more details.
+**
+**  You should have received a copy of the GNU General Public License
+**  along with this program; if not, write to the Free Software
+**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+******************************************************************************/
+
 
 #ifndef __H_EZPLOT
 #define __H_EZPLOT
 
 #include <stdio.h>
 #include <stddef.h>
-#include "kstddef.h"
 #include <ctype.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];
+#include "ctsupport.h"
+#include "sgp.h"
+
+
+class EZPlotCurve {
+ public:
+    double *x;
+    double *y;
+    int m_iPointCount;
+    int m_iLineStyle;
+    int m_iSymbol;
+    int m_iSymbolFreq;
+    int m_iColor;
+    string m_sLegend;
+
+    EZPlotCurve (const double* x, const double* y, int n, int color, int linestyle, int symbol, int sumbolFreq, const 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 */
+
+/* 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>
+using namespace std;
+
+typedef vector<EZPlotCurve*>::iterator EZPlotCurveIterator;
+typedef vector<EZPlotCurve*>::const_iterator EZPlotCurveConstIterator;
+
+class SGP;
+class EZPlot {
+ private:
+    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 */
+
+    string c_xlabel;   /* label for x axis */
+    string c_ylabel;   /* label for y axis */
+    string c_title;            /* title to print above graph */
+    string c_legend;;  /* 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 */
+
+    // 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 */
+
+    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);
+    int do_cmd(int lx);
+    void bad_option(char *opt);
+    void initPlotSettings();
+
+    static void initkw(void);
+    
+    static bool ezset_initialized;
+
+ 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                                  */
@@ -55,9 +245,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
@@ -98,8 +285,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
@@ -117,195 +302,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