X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Fezplot.h;h=716fd3e2b361c8946448a7ecb5ea12d5edcbac6c;hp=c5838c0a5bec1b765cc79d0e55e2d1e1527c82fe;hb=a05f3cb550877e94aa118cc04b361c0c8fdb3dc3;hpb=13838bda88b63a2535b5baaf7197006767de4b8e diff --git a/include/ezplot.h b/include/ezplot.h index c5838c0..716fd3e 100644 --- a/include/ezplot.h +++ b/include/ezplot.h @@ -1,40 +1,230 @@ -/*----------------------------------------------------------------------*/ -/* 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 #include -#include "kstddef.h" #include -#include "sgp.h" #include -#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 +using namespace std; + +typedef vector::iterator EZPlotCurveIterator; +typedef vector::const_iterator EZPlotCurveConstIterator; + +class SGP; +class EZPlot { + private: + vector 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