1 /*****************************************************************************
5 ** Purpose: Header file for EZplot library
7 ** This is part of the CTSim program
8 ** Copyright (c) 1983-2009 Kevin Rosenberg
10 ** This program is free software; you can redistribute it and/or modify
11 ** it under the terms of the GNU General Public License (version 2) as
12 ** published by the Free Software Foundation.
14 ** This program is distributed in the hope that it will be useful,
15 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ** GNU General Public License for more details.
19 ** You should have received a copy of the GNU General Public License
20 ** along with this program; if not, write to the Free Software
21 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 ******************************************************************************/
32 #include "ctsupport.h"
43 EZPlotCurve (const double* x, const double* y, int n);
48 //----------------------------------------------------------------------
50 //----------------------------------------------------------------------
54 LINEAR = 1, // linear axis
55 LOG, // logrithmic axis
56 NOAXIS, // don't plot axis
90 INSIDE = 1, // values of o_legendbox
96 struct KeywordCodeTable {
101 /*-----------------------------------------------------------------------------
105 * i_ Internal variable
108 * Normal variable that is user modifiable
109 * These variables must always have a valid value
111 * Variables controlling devices
112 * clr_ Color variable
113 * Holds a color value
114 * c_ Character string variable
115 * Contains a character string
117 * User modifiable variable associated with the set variable (s_)
118 * These variables do not always have a valid value
119 * These variables change assumption EZPLOT makes about the plot
121 * TRUE if associated value variable (v_) has been set by the user
122 *---------------------------------------------------------------------------*/
126 typedef std::vector<EZPlotCurve*>::iterator EZPlotCurveIterator;
127 typedef std::vector<EZPlotCurve*>::const_iterator EZPlotCurveConstIterator;
132 //----------------------------------------------------------------------
134 //----------------------------------------------------------------------
210 static const struct KeywordCodeTable m_sKeywords[];
211 static const int NKEYS;
213 std::vector<class EZPlotCurve*> m_vecCurves;
214 std::vector<int> m_veciColor;
215 std::vector<bool> m_vecbColorSet;
216 std::vector<int> m_veciSymbol;
217 std::vector<bool> m_vecbSymbolSet;
218 std::vector<int> m_veciSymbolFreq;
219 std::vector<bool> m_vecbSymbolFreqSet;
220 std::vector<int> m_veciLinestyle;
221 std::vector<bool> m_vecbLinestyleSet;
222 std::vector<std::string> m_vecsLegend;
223 std::vector<bool> m_vecbLegendSet;
225 int getColor (unsigned int iCurve) const;
226 int getSymbol (unsigned int iCurve) const;
227 const std::string* getLegend (unsigned int iCurve) const;
228 int getSymbolFreq (unsigned int iCurve) const;
229 int getLinestyle (unsigned int iCurve) const;
231 void setColor (unsigned int iCurve, int iColor);
232 void setSymbol (unsigned int iCurve, int iSymbol);
233 void setSymbolFreq (unsigned int iCurve, int iSymbolFreq);
234 void setLinestyle (unsigned int iCurve, int iLinestyle);
235 void setLegend (unsigned int iCurve, const std::string& strLegend);
236 void setLegend (unsigned int iCurve, const char* const pszLegend);
241 int clr_axis; // color of all axis lines
242 int clr_title; // color of main title
243 int clr_label; // color of axis labels
244 int clr_legend; // color of legend box
245 int clr_grid; // color of grid lines
246 int clr_number; // color of axis number labels
249 double o_xporigin, o_yporigin; // origin of plot frame in NDC
250 double o_xlength, o_ylength; // length of plot frame in NDC
252 std::string c_xlabel; // label for x axis
253 std::string c_ylabel; // label for y axis
254 std::string c_title; // title to print above graph
256 int o_linestyle, o_color; // style to use for curves all subsequent curves to EZPLOT
257 int o_xaxis, o_yaxis; // Specifies where axis & labels are drawn
258 bool o_grid; // Flag to draw a grid at major ticks
259 bool o_box; // Flag to draw a box around the graph
261 int o_xticks, o_yticks; // direction to draw tick marks
262 bool o_xtlabel, o_ytlabel; // TRUE if label tick marks
264 int o_xmajortick, o_ymajortick; // number of major ticks to draw
265 int o_xminortick, o_yminortick; // number of minor ticks between major ticks
267 int o_symbol; // Symbol type, (0 = no symbol)
268 int o_symfreq; // frequency to draw symbols at curve points
270 int o_legendbox; // controls whether legend is inside or outside of the axis extents
271 int o_tag; // controls whether to draw tag at end of axes
273 // VALUE & SET variables
274 double v_xmin, v_xmax, v_ymin, v_ymax; // user supplied axis endpoints
275 bool s_xmin, s_xmax, s_ymin, s_ymax; // TRUE is endpoint has been set
276 double v_xtitle, v_ytitle; // NDC position to plot title
277 bool s_xtitle, s_ytitle; // TRUE if set position for title
278 double v_xcross, v_ycross; // position that axes cross
279 bool s_xcross, s_ycross; // TRUE if set axes cross position
280 double v_xlegend, v_ylegend; // upper-left position of legend box in NDC
281 bool s_xlegend, s_ylegend; // TRUE if set position of legend box
282 int v_lxfrac, v_lyfrac; // number of digits to right of decimal place
283 bool s_lxfrac, s_lyfrac; // TRUE if set number of fractional digits
284 double v_textsize; // size of text in NDC
285 bool s_textsize; // TRUE if user set size of text
288 double charheight; // Height of characters in NDC
289 double charwidth; // Height of characters in NDC
290 double xp_min, xp_max, yp_min, yp_max; // boundry of plot frame in NDC
291 double xa_min, xa_max, ya_min, ya_max; // extent of axes in NDC
292 double xgw_min, xgw_max, ygw_min, ygw_max; // boundary of graph in input coords
293 double xgn_min, xgn_max, ygn_min, ygn_max; // boundy of graph in NDC
294 double xt_min, xt_max, yt_min, yt_max; // boundary of axis ticks
295 double xl_min, xl_max, yl_min, yl_max; // boundary of legend box
296 double title_row; // y-coord of title row
297 double xtl_ofs; // Offset y-coord of x tick labels from axis
298 double ytl_ofs; // Offset x-coord of y tick labels from axis
299 double xlbl_row; // row of x label in world coord
300 double ylbl_col; // column of y label in world coord
301 double xw_tickinc, yw_tickinc; // increment between major ticks in WC
302 double xn_tickinc, yn_tickinc; // increment between major ticks in NDC
303 int x_nint, y_nint; // number of intervals along x & y axes
304 int x_fldwid, x_frac; // numeric field sizes & number of digits
305 int y_fldwid, y_frac; // in fraction of number, used for printf()
306 double xtl_wid, ytl_wid; // length of ticks labels in NDC
307 double tl_height; // height of tick labels in NDC
308 char x_numfmt[20]; // format to print x tick labels
309 char y_numfmt[20]; // format to print y tick labels
311 double m_dVP_xmin, m_dVP_ymin;
312 double m_dVP_xmax, m_dVP_ymax;
313 double m_dVP_xscale, m_dVP_yscale;
314 double m_xWorldScale, m_yWorldScale;
317 void symbol (int sym, double symwidth, double symheight);
318 void make_numfmt(char *fmtstr, int *fldwid, int *nfrac, double min, double max, int nint);
319 int axis_scale (double min, double max, int nint, double *minp, double *maxp, int *nintp);
326 bool ezcmd (const char* const comm);
328 void bad_option(const char *opt);
329 void initPlotSettings();
331 void initKeywords ();
333 double convertWorldToNDC_X (double x)
334 { return xgn_min + (x - xgw_min) * m_xWorldScale; }
336 double convertWorldToNDC_Y (double y)
337 { return ygn_min + (y - ygw_min) * m_yWorldScale; }
343 bool ezset (const std::string& command);
344 bool ezset (const char* const command);
346 void addCurve (const float* x, const double* y, int num);
347 void addCurve (const double* x, const float* y, int num);
348 void addCurve (const double* x, const double* y, int num);
349 void addCurve (const double* y, int n);
350 void addCurve (const float* y, int n);
352 void plot (SGP* pSGP);