void CpintPlot::plot_CP_curve(CpintPlot *thisPlot, // the plot we're currently displaying double cp, double tau, double t0) { if (CPCurve) { delete CPCurve; CPCurve = NULL; } // if there's no cp, then there's nothing to do if (cp <= 0) return; // populate curve data with a CP curve const int curve_points = 100; double tmin = USE_T0_IN_CP_MODEL ? 1.0/60 : tau; double tmax = 180.0; QVector<double> cp_curve_power(curve_points); QVector<double> cp_curve_time(curve_points); int i; for (i = 0; i < curve_points; i ++) { double x = (double) i / (curve_points - 1); double t = pow(tmax, x) * pow(tmin, 1-x); cp_curve_time[i] = t; if (series == RideFile::none) //XXX this is ENERGY cp_curve_power[i] = (cp * t + cp * tau) * 60.0 / 1000.0; else cp_curve_power[i] = cp * (1 + tau / (t + t0)); } // generate a plot QString curve_title; #if USE_T0_IN_CP_MODEL curve_title.sprintf("CP=%.1f W; AWC/CP=%.2f m; t0=%.1f s", cp, tau, 60 * t0); #else if (series == RideFile::wattsKg) curve_title.sprintf("CP=%.2f W/kg; AWC=%.2f kJ/kg", cp, cp * tau * 60.0 / 1000.0); else curve_title.sprintf("CP=%.0f W; AWC=%.0f kJ", cp, cp * tau * 60.0 / 1000.0); #endif if (series == RideFile::watts || series == RideFile::wattsKg) curveTitle.setLabel(QwtText(curve_title, QwtText::PlainText)); if (series == RideFile::wattsKg) curveTitle.setYValue(0.6); else curveTitle.setYValue(20); CPCurve = new QwtPlotCurve(curve_title); if (appsettings->value(this, GC_ANTIALIAS, false).toBool() == true) CPCurve->setRenderHint(QwtPlotItem::RenderAntialiased); QPen pen(GColor(CCP)); pen.setWidth(appsettings->value(this, GC_LINEWIDTH, 2.0).toDouble()); pen.setStyle(Qt::DashLine); CPCurve->setPen(pen); CPCurve->setData(cp_curve_time.data(), cp_curve_power.data(), curve_points); CPCurve->attach(thisPlot); }
void CpintPlot::plot_CP_curve(CpintPlot *thisPlot, // the plot we're currently displaying double cp, double tau, double t0) { if (CPCurve) { delete CPCurve; CPCurve = NULL; } // if there's no cp, then there's nothing to do if (cp <= 0) return; // populate curve data with a CP curve const int curve_points = 100; double tmin = useT0 ? 1.00/60.00 : tau; // we want to see the entire curve for 3 model double tmax = 180.0; QVector<double> cp_curve_power(curve_points); QVector<double> cp_curve_time(curve_points); int i; for (i = 0; i < curve_points; i ++) { double x = (double) i / (curve_points - 1); double t = pow(tmax, x) * pow(tmin, 1-x); cp_curve_time[i] = t; if (series == RideFile::none) //this is ENERGY cp_curve_power[i] = (cp * t + cp * tau) * 60.0 / 1000.0; else cp_curve_power[i] = cp * (1 + tau / (t + t0)); } // generate a plot QString curve_title; #if 0 //XXX ? if (useT0) { curve_title.sprintf("CP=%.1f w; W'/CP=%.2f m; t0=%.1f s", cp, tau, 60 * t0); } else { #endif if (series == RideFile::wattsKg) curve_title.sprintf("CP=%.2f w/kg; W'=%.2f kJ/kg", cp, cp * tau * 60.0 / 1000.0); else curve_title.sprintf("CP=%.0f w; W'=%.0f kJ", cp, cp * tau * 60.0 / 1000.0); #if 0 } #endif if (series == RideFile::watts || series == RideFile::aPower || series == RideFile::xPower || series == RideFile::NP || series == RideFile::wattsKg) { QwtText text(curve_title, QwtText::PlainText); text.setColor(GColor(CPLOTMARKER)); curveTitle.setLabel(text); } if (series == RideFile::wattsKg) curveTitle.setYValue(0.6); else curveTitle.setYValue(70); CPCurve = new QwtPlotCurve(curve_title); if (appsettings->value(this, GC_ANTIALIAS, false).toBool() == true) CPCurve->setRenderHint(QwtPlotItem::RenderAntialiased); QPen pen(GColor(CCP)); pen.setWidth(1.0); pen.setStyle(Qt::DashLine); CPCurve->setPen(pen); CPCurve->setSamples(cp_curve_time.data(), cp_curve_power.data(), curve_points); CPCurve->attach(thisPlot); // Extended CP 2 /*if (extendedCPCurve2) { delete extendedCPCurve2; extendedCPCurve2 = NULL; } extendedCPCurve2 = ecp->getPlotCurveForExtendedCP_2_3(athleteModeleCP2); extendedCPCurve2->attach(thisPlot); if (extendedCurveTitle) { delete extendedCurveTitle; extendedCurveTitle = NULL; } extendedCurveTitle = ecp->getPlotMarkerForExtendedCP_2_3(athleteModeleCP2); extendedCurveTitle->setXValue(5); extendedCurveTitle->setYValue(45); extendedCurveTitle->attach(thisPlot);*/ // Extended CP 4 if (extendedCPCurve4) { delete extendedCPCurve4; extendedCPCurve4 = NULL; } if (extendedCurveTitle2) { delete extendedCurveTitle2; extendedCurveTitle2 = NULL; } if (useExtendedCP) { extendedCPCurve4 = ecp->getPlotCurveForExtendedCP_4_3(athleteModeleCP4); extendedCPCurve4->attach(thisPlot); extendedCurveTitle2 = ecp->getPlotMarkerForExtendedCP_4_3(athleteModeleCP4); extendedCurveTitle2->setXValue(5); extendedCurveTitle2->setYValue(20); extendedCurveTitle2->attach(thisPlot); } }