/*****************************************************************************
** FILE IDENTIFICATION
**
-** EZPLOT
+** ezplot.cpp
**
** This is part of the CTSim program
-** Copyright (c) 1983-2001 Kevin Rosenberg
-**
-** $Id$
+** Copyright (c) 1983-2009 Kevin Rosenberg
**
** 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
s_xlegend = FALSE;
s_ylegend = FALSE;
s_textsize = FALSE;
+ s_xmin = FALSE;
+ s_xmax = FALSE;
+ s_ymin = FALSE;
+ s_ymax = FALSE;
clr_axis = C_LTGRAY; // set fixed colors
clr_title = C_RED;
double symheight = charheight * 0.3; // size of symbol in NDC
double symwidth = symheight;
- const EZPlotCurve& firstCurve = *m_vecCurves[0];
+ if (m_vecCurves.size() < 1)
+ return; // can't plot if there are no curves to plot
+
+ // find a curve with at least one point to get base point
+ double xmin, xmax, ymin, ymax; // extent of curves in world coord
+ bool found = false;
- double xmin = firstCurve.x[0]; // extent of curves in world coord
- double xmax = xmin;
- double ymin = firstCurve.y[0];
- double ymax = ymin;
+ for (unsigned int iCurve = 0; iCurve < m_vecCurves.size(); iCurve++) {
+ const EZPlotCurve* const pCurve = m_vecCurves [iCurve];
+ if (pCurve->m_iPointCount > 0) {
+ xmin = pCurve->x[0];
+ xmax = xmin;
+ ymin = pCurve->y[0];
+ ymax = ymin;
+ found = true;
+ break;
+ }
+ }
+ if (! found)
+ return; // curve(s) are empty, so no plotting
- unsigned int iCurve;
- for (iCurve = 0; iCurve < m_vecCurves.size(); iCurve++) {
+ for (unsigned int iCurve = 0; iCurve < m_vecCurves.size(); iCurve++) {
const EZPlotCurve* const pCurve = m_vecCurves [iCurve];
for (int ip = 0; ip < pCurve->m_iPointCount; ip++) {
if (! axis_scale (xmin, xmax, o_xmajortick - 1, &xgw_min, &xgw_max, &x_nint) || ! axis_scale (ymin, ymax, o_ymajortick - 1, &ygw_min, &ygw_max, &y_nint))
return;
+
// check if user set x-axis extents
if (s_xmin == TRUE) {
xgw_min = v_xmin;
int max_leg = 0; // longest legend in characters
int num_leg = 0; // number of legend titles
- for (iCurve = 0; iCurve < m_vecCurves.size(); iCurve++) {
+ for (unsigned int iCurve = 0; iCurve < m_vecCurves.size(); iCurve++) {
const std::string* pstrLegend = getLegend (iCurve);
if (pstrLegend && pstrLegend->length() > 0) {
int iLegend = 0; // current legend position
- for (iCurve = 0; iCurve < m_vecCurves.size(); iCurve++) {
+ for (unsigned int iCurve = 0; iCurve < m_vecCurves.size(); iCurve++) {
const std::string* pstrLegend = getLegend (iCurve);
if (! pstrLegend || pstrLegend->length() == 0)
continue;
- for (iCurve = 0; iCurve < m_vecCurves.size(); iCurve++) {
+ for (unsigned int iCurve = 0; iCurve < m_vecCurves.size(); iCurve++) {
const EZPlotCurve* const pCurve = m_vecCurves [iCurve];
-
m_pSGP->setColor (getColor (iCurve));
-
int iSym = getSymbol (iCurve);
-
int iLS = getLinestyle (iCurve);
-
-
if (iLS != SGP::LS_NOLINE) {
m_pSGP->setLineStyle (iLS);
double x1 = convertWorldToNDC_X (pCurve->x[0]);
int
EZPlot::axis_scale (double min, double max, int nint, double *minp, double *maxp, int *nintp)
{
- if (min >= max || nint < 1) {
- sys_error (ERR_WARNING, "Invalid params: min=%lf, max=%lf, num intervals=%d [axis_scale]", min, max, nint);
+ if (nint < 1) {
+ sys_error (ERR_WARNING, "No intervals to plot: num intervals=%d [axis_scale]", nint);
return (FALSE);
}
+ if (min >= max) {
+ double scaled = fabs(max) / 10;
+ if (scaled == 0)
+ scaled = 0.1;
+ *minp = min - scaled;
+ *maxp = max + scaled;
+ *nintp = 2;
+ return (TRUE);
+ }
double eps = 0.025;
double a = fabs(min);