X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=include%2Fezplot.h;h=31291bd617872d2b6c7c77313515fdb08306ff6c;hp=4494f01470613349566cc8a1e5f922588867fe5a;hb=dc034c9d0b7d9c3874a324a4c2c189a02945adc8;hpb=8736131be5db05a5b15fe36252665a53016789e2 diff --git a/include/ezplot.h b/include/ezplot.h index 4494f01..31291bd 100644 --- a/include/ezplot.h +++ b/include/ezplot.h @@ -1,18 +1,13 @@ /***************************************************************************** -** This is part of the CTSim program -** Copyright (C) 1983-2000 Kevin Rosenberg -** -** $Id: ezplot.h,v 1.4 2000/05/24 22:48:17 kevin Exp $ -** $Log: ezplot.h,v $ -** Revision 1.4 2000/05/24 22:48:17 kevin -** First functional version of SDF library for X-window +** FILE IDENTIFICATION ** -** Revision 1.3 2000/05/07 12:46:19 kevin -** made c++ compatible +** Name: ezplot.h +** Purpose: Header file for EZplot library ** -** Revision 1.2 2000/04/28 14:14:16 kevin -** *** empty log message *** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg ** +** $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 @@ -27,52 +22,223 @@ ** 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 -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -#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]; + + +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 + +// 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 + *---------------------------------------------------------------------------*/ -/*----------------------------------------------------------------------*/ -/* Codes from LEX */ -/*----------------------------------------------------------------------*/ +#include + +typedef std::vector::iterator EZPlotCurveIterator; +typedef std::vector::const_iterator EZPlotCurveConstIterator; + +class SGP; +class EZPlot { + private: + std::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 + + 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 @@ -89,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 @@ -132,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 @@ -151,204 +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 */ -SGP_ID 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); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ #endif