diff --git a/apps/shared/cartesian_function.h b/apps/shared/cartesian_function.h index 92bdfbd16..dbceddd76 100644 --- a/apps/shared/cartesian_function.h +++ b/apps/shared/cartesian_function.h @@ -42,6 +42,7 @@ public: int derivativeNameWithArgument(char * buffer, size_t bufferSize); double approximateDerivative(double x, Poincare::Context * context) const; // tMin and tMax + bool shouldClipTRangeToXRange() const override { return plotType() == PlotType::Cartesian; } double tMin() const override; double tMax() const override; void setTMin(double tMin); diff --git a/apps/shared/curve_view.cpp b/apps/shared/curve_view.cpp index 06463f3d1..7014fb88d 100644 --- a/apps/shared/curve_view.cpp +++ b/apps/shared/curve_view.cpp @@ -531,6 +531,7 @@ void CurveView::drawCurve(KDContext * ctx, KDRect rect, float tStart, float tEnd void CurveView::drawCartesianCurve(KDContext * ctx, KDRect rect, float xMin, float xMax, EvaluateXYForParameter xyEvaluation, void * model, void * context, KDColor color, bool colorUnderCurve, float colorLowerBound, float colorUpperBound) const { float tStart = maxFloat(xMin, pixelToFloat(Axis::Horizontal, rect.left() - k_externRectMargin)); float tEnd = minFloat(xMax, pixelToFloat(Axis::Horizontal, rect.right() + k_externRectMargin)); + assert(!std::isinf(tStart) && !std::isnan(tStart) && !std::isinf(tEnd) && !std::isnan(tEnd) ); if (tStart > tEnd) { return; } diff --git a/apps/shared/function.h b/apps/shared/function.h index 11e0adfec..b439502b1 100644 --- a/apps/shared/function.h +++ b/apps/shared/function.h @@ -34,6 +34,7 @@ public: void setActive(bool active); // Definition Interval + virtual bool shouldClipTRangeToXRange() const { return true; } // Returns true if the function will not be displayed if t is outside x range. virtual double tMin() const { return NAN; } virtual double tMax() const { return NAN; } diff --git a/apps/shared/function_graph_controller.cpp b/apps/shared/function_graph_controller.cpp index e5b91532d..4a47d6a6d 100644 --- a/apps/shared/function_graph_controller.cpp +++ b/apps/shared/function_graph_controller.cpp @@ -92,10 +92,14 @@ InteractiveCurveViewRangeDelegate::Range FunctionGraphController::computeYRange( double tMin = f->tMin(); if (std::isnan(tMin)) { tMin = xMin; + } else if (f->shouldClipTRangeToXRange()) { + tMin = maxFloat(tMin, xMin); } double tMax = f->tMax(); if (std::isnan(tMax)) { tMax = xMax; + } else if (f->shouldClipTRangeToXRange()) { + tMax = minFloat(tMax, xMax); } const int balancedBound = std::floor((tMax-tMin)/2/step); for (int j = -balancedBound; j <= balancedBound ; j++) {