bool ScaleDiv::rebuild(double x1, double x2, int maxMajSteps, int maxMinSteps, bool log, double step, bool ascend) { int rv; d_lBound = qwtMin(x1, x2); d_hBound = qwtMax(x1, x2); d_log = log; if (d_log) rv = buildLogDiv(maxMajSteps, maxMinSteps, step); else rv = buildLinDiv(maxMajSteps, maxMinSteps, step); if ((!ascend) && (x2 < x1)) { d_lBound = x1; d_hBound = x2; qwtTwistArray(d_majMarks.data(), d_majMarks.size()); qwtTwistArray(d_minMarks.data(), d_minMarks.size()); } return rv; }
/*! \brief Draw a spline \param painter Painter \param xMap x map \param yMap y map \sa QwtCurve::draw, QwtCurve::drawCurve, QwtCurve::drawDots, QwtCurve::drawLines, QwtCurve::drawSteps, QwtCurve::drawSticks */ void QwtCurve::drawSpline(QPainter *painter, const QwtDiMap &xMap, const QwtDiMap &yMap) { register int i; int size = dataSize(); double *txval = new double[size]; double *tyval = new double[size]; if ( !txval || !tyval ) { if (txval) delete[] txval; if (tyval) delete[] tyval; return; } QPointArray polyline(d_splineSize); // // Transform x and y values to window coordinates // to avoid a distinction between linear and // logarithmic scales. // for (i=0;i<size;i++) { txval[i] = xMap.xTransform(x(i)); tyval[i] = yMap.xTransform(y(i)); } int stype; if (! (d_options & (Yfx|Xfy|Parametric))) { if (qwtChkMono(txval, size)) { stype = Yfx; } else { if(qwtChkMono(tyval, size)) { stype = Xfy; } else { stype = Parametric; if ( (d_options & Periodic) || ( (x(0) == x(size-1)) && (y(0) == y(size-1)))) { stype |= Periodic; } } } } else { stype = d_options; } if (stype & Parametric) { double *param = new double[size]; if (param) { // // setup parameter vector // param[0] = 0.0; for (i=1; i<size; i++) { double delta = sqrt( qwtSqr(txval[i] - txval[i-1]) + qwtSqr( tyval[i] - tyval[i-1])); param[i] = param[i-1] + qwtMax(delta, 1.0); } // // setup splines int rc = d_spx.recalc(param, txval, size, stype & Periodic); if (!rc) rc = d_spy.recalc(param, tyval, size, stype & Periodic); if (rc) { drawLines(painter, xMap, yMap, 0, size - 1); } else { // fill point array double delta = param[size - 1] / double(d_splineSize-1); for (i=0;i<d_splineSize;i++) { double dtmp = delta * double(i); polyline.setPoint(i, int(floor (d_spx.value(dtmp) + 0.5)), int(floor (d_spy.value(dtmp) + 0.5))); } } delete[] param; } } else if (stype & Xfy) { if (tyval[size-1] < tyval[0]) { qwtTwistArray(txval, size); qwtTwistArray(tyval, size); } // 1. Calculate spline coefficients int rc = d_spx.recalc(tyval, txval, size, stype & Periodic); if (rc) // an error occurred { drawLines(painter, xMap, yMap, 0, size - 1); } else // Spline OK { double ymin = qwtGetMin(tyval, size); double ymax = qwtGetMax(tyval, size); double delta = (ymax - ymin) / double(d_splineSize - 1); for (i=0;i<d_splineSize;i++) { double dtmp = ymin + delta * double(i); polyline.setPoint(i, int(floor(d_spx.value(dtmp) + 0.5)), int(floor(dtmp + 0.5))); } } } else { if (txval[size-1] < txval[0]) { qwtTwistArray(tyval, size); qwtTwistArray(txval, size); } // 1. Calculate spline coefficients int rc = d_spy.recalc(txval, tyval, size, stype & Periodic); if (rc) // error { drawLines(painter, xMap, yMap, 0, size - 1); } else // Spline OK { double xmin = qwtGetMin(txval, size); double xmax = qwtGetMax(txval, size); double delta = (xmax - xmin) / double(d_splineSize - 1); for (i=0;i<d_splineSize;i++) { double dtmp = xmin + delta * double(i); polyline.setPoint(i, int(floor (dtmp + 0.5)), int(floor(d_spy.value(dtmp) + 0.5))); } } } delete[] txval; delete[] tyval; QwtPainter::drawPolyline(painter, polyline); if ( painter->brush().style() != Qt::NoBrush ) { closePolyline(xMap, yMap, polyline); painter->setPen(QPen(Qt::NoPen)); QwtPainter::drawPolygon(painter, polyline); } }