X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Fezplot.h;h=af9d5852be6bdba8b761828b19fb556059aabbb5;hp=26a4c34c09ae15e4bdfb94633c6df8233c2c4d76;hb=1a050c98763fbbc0662731b0b76953acede6f5d7;hpb=8fc6888d2599bb288f8ff7008994f2b66ecf6d93 diff --git a/include/ezplot.h b/include/ezplot.h index 26a4c34..af9d585 100644 --- a/include/ezplot.h +++ b/include/ezplot.h @@ -1,12 +1,13 @@ /***************************************************************************** -** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg +** FILE IDENTIFICATION +** +** Name: ezplot.h +** Purpose: Header file for EZplot library ** -** $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 *** +** This is part of the CTSim program +** Copyright (c) 1983-2001 Kevin Rosenberg ** +** $Id$ ** ** 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 @@ -21,314 +22,336 @@ ** 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 +#include +#include +#include #include -#include "kstddef.h" -#include +#include "ctsupport.h" #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]; -}; - -#define XBUF_DEF 600 -#define YBUF_DEF XBUF_DEF * (72. / 120.) * 0.75 -#define PRTMODE_DEF 1 - -/*----------------------------------------------------------------------*/ -/* Codes from LEX */ -/*----------------------------------------------------------------------*/ - -#define S_DATA 2 -#define S_HELP 3 -#define S_EXIT 4 - -#define S_SOLID -10 -#define S_DASH -11 -#define S_NOLINE -12 -#define S_BLACK -13 -#define S_RED -14 -#define S_BLUE -15 -#define S_GREEN -16 -#define S_PEN -17 -#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 -#define S_XLIN -27 -#define S_YLIN -28 -#define S_XLOG -29 -#define S_YLOG -30 -#define S_XLABEL -31 -#define S_YLABEL -32 -#define S_XLENGTH -33 -#define S_YLENGTH -34 -#define S_XTICKS -35 -#define S_YTICKS -36 -#define S_ABOVE -37 -#define S_LABEL -38 -#define S_BELOW -39 -#define S_NOLABEL -40 -#define S_RIGHT -41 -#define S_LEFT -42 -#define S_XAUTOSCALE -43 -#define S_YAUTOSCALE -44 -#define S_XMIN -45 -#define S_YMIN -46 -#define S_XMAX -47 -#define S_YMAX -48 -#define S_LXFRAC -49 -#define S_LYFRAC -50 -#define S_XCROSS -51 -#define S_YCROSS -52 -#define S_NOXAXIS -53 -#define S_NOYAXIS -54 -#define S_XPORIGIN -55 -#define S_YPORIGIN -56 -#define S_TITLE -57 -#define S_XTITLE -58 -#define S_YTITLE -59 -#define S_REPLOT -60 -#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 -#define S_UNITS -69 -#define S_INCHES -70 -#define S_USER -71 - -#define S_BOX -100 -#define S_NOBOX -101 -#define S_GRID -102 -#define S_NOGRID -103 -#define S_MAJOR -104 -#define S_MINOR -105 -#define S_COLOR -106 -#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]; +#include "pol.h" -/*--------------------*/ -/* 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 */ -/*-----------------------*/ +class EZPlotCurve { +public: + double *x; + double *y; + int m_iPointCount; -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 */ + EZPlotCurve (const double* x, const double* y, int n); -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 */ + ~EZPlotCurve(); +}; -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 */ +//---------------------------------------------------------------------- +// GLOBAL VARIABLES +//---------------------------------------------------------------------- -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 */ +// axis definitions +enum { + LINEAR = 1, // linear axis + LOG, // logrithmic axis + NOAXIS, // don't plot axis +}; -double v_textsize; /* size of text in NDC */ -bool s_textsize; /* TRUE if user set size of text */ +// tick definitions +enum { + ABOVE = 1, + BELOW, + RIGHT, + LEFT, +}; -}; /* end of EZPLOT VARIABLES */ +// line types +enum { + NOLINE = 0, + SOLID, + DASH, + DASH1, + DASH2, + DASH3, + DASH4, +}; +// symbol definitions +enum { + SB_CROSS = 1, + SB_PLUS, + SB_BOX, + SB_CIRCLE, + SB_ERRORBAR, + SB_POINT, + MAXSYMBOL, +}; +enum { + INSIDE = 1, // values of o_legendbox + OUTSIDE, + NOLEGEND, +}; -extern struct ezplot_var ez; -extern bool ezplot_firstcall; /* set to false on first call to EZSET or EZPLOT */ +struct KeywordCodeTable { + char* keyword; + int code; +}; -/* 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); +/*----------------------------------------------------------------------------- +* 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 + +typedef std::vector::iterator EZPlotCurveIterator; +typedef std::vector::const_iterator EZPlotCurveConstIterator; + +class SGP; +class EZPlot { +private: + //---------------------------------------------------------------------- + // POL Codes + //---------------------------------------------------------------------- + + enum { + S_DATA = 2, + S_HELP, + S_EXIT, + S_CURVE, + S_SOLID, + S_DASH, + S_NOLINE, + S_BLACK, + S_RED, + S_GREEN, + S_BLUE, + S_SYMBOL, + S_PEN, + S_EVERY, + S_NONE, + S_LEGEND, + S_XLEGEND, + S_YLEGEND, + S_XLIN, + S_YLIN, + S_XLOG, + S_YLOG, + S_XLABEL, + S_YLABEL, + S_XLENGTH, + S_YLENGTH, + S_XTICKS, + S_YTICKS, + S_ABOVE, + S_LABEL, + S_BELOW, + S_NOLABEL, + S_RIGHT, + S_LEFT, + S_XAUTOSCALE, + S_YAUTOSCALE, + S_XMIN, + S_YMIN, + S_XMAX, + S_YMAX, + S_LXFRAC, + S_LYFRAC, + S_XCROSS, + S_YCROSS, + S_NOXAXIS, + S_NOYAXIS, + S_XPORIGIN, + S_YPORIGIN, + S_TITLE, + S_XTITLE, + S_YTITLE, + S_REPLOT, + S_CLEAR, + S_STORE, + S_RESTORE, + S_AMARK, + S_NO, + S_INTERACTIVE, + S_UNITS, + S_INCHES, + S_USER, + S_BOX, + S_NOBOX, + S_GRID, + S_NOGRID, + S_MAJOR, + S_MINOR, + S_COLOR, + S_LEGENDBOX, + S_TAG, + S_TEXTSIZE, + }; + + static const struct KeywordCodeTable m_sKeywords[]; + static const int NKEYS; + + std::vector m_vecCurves; + std::vector m_veciColor; + std::vector m_vecbColorSet; + std::vector m_veciSymbol; + std::vector m_vecbSymbolSet; + std::vector m_veciSymbolFreq; + std::vector m_vecbSymbolFreqSet; + std::vector m_veciLinestyle; + std::vector m_vecbLinestyleSet; + std::vector m_vecsLegend; + std::vector m_vecbLegendSet; + + int getColor (unsigned int iCurve) const; + int getSymbol (unsigned int iCurve) const; + const std::string* getLegend (unsigned int iCurve) const; + int getSymbolFreq (unsigned int iCurve) const; + int getLinestyle (unsigned int iCurve) const; + + void setColor (unsigned int iCurve, int iColor); + void setSymbol (unsigned int iCurve, int iSymbol); + void setSymbolFreq (unsigned int iCurve, int iSymbolFreq); + void setLinestyle (unsigned int iCurve, int iLinestyle); + void setLegend (unsigned int iCurve, const std::string& strLegend); + void setLegend (unsigned int iCurve, const char* const pszLegend); + + int m_iCurrentCurve; + + // 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 + + 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 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* m_pSGP; + POL m_pol; + + void clearCurves (); + + bool ezcmd (const char* const comm); + bool do_cmd(int lx); + void bad_option(char *opt); + void initPlotSettings(); + + void initKeywords (); + + 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 (); + ~EZPlot (); + + bool ezset (const std::string& command); + bool ezset (const char* const 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 (SGP* pSGP); +}; #endif