diff --git a/apps/graph/graph/integral_graph_controller.cpp b/apps/graph/graph/integral_graph_controller.cpp index c5b039d7b..3c781c31d 100644 --- a/apps/graph/graph/integral_graph_controller.cpp +++ b/apps/graph/graph/integral_graph_controller.cpp @@ -1,6 +1,5 @@ #include "integral_graph_controller.h" #include "../../shared/text_field_delegate.h" -#include #include #include "../app.h" @@ -47,11 +46,4 @@ Layout IntegralGraphController::createFunctionLayout(ExpiringPointer function, double start, double end, Poincare::Context * context) const { - return Poincare::Integral::Builder(function->expressionReduced(context).clone(), Poincare::Symbol::Builder(UCodePointUnknownX), Poincare::Float::Builder(start), Poincare::Float::Builder(end)); // Integral takes ownership of args - /* TODO: when we approximate integral, we might want to simplify the integral - * here. However, we might want to do it once for all x (to avoid lagging in - * the derivative table. */ -} - } diff --git a/apps/graph/graph/integral_graph_controller.h b/apps/graph/graph/integral_graph_controller.h index 7e7257a59..6243127d7 100644 --- a/apps/graph/graph/integral_graph_controller.h +++ b/apps/graph/graph/integral_graph_controller.h @@ -15,7 +15,6 @@ private: I18n::Message legendMessageAtStep(Step step) override; double cursorNextStep(double position, int direction) override; Poincare::Layout createFunctionLayout(Shared::ExpiringPointer function) override; - Poincare::Expression sumBetweenBounds(Shared::ExpiringPointer function, double start, double end, Poincare::Context * context) const override; }; } diff --git a/apps/sequence/graph/term_sum_controller.cpp b/apps/sequence/graph/term_sum_controller.cpp index 6446926ee..71cad17bb 100644 --- a/apps/sequence/graph/term_sum_controller.cpp +++ b/apps/sequence/graph/term_sum_controller.cpp @@ -1,6 +1,5 @@ #include "term_sum_controller.h" #include "../../shared/text_field_delegate.h" -#include #include #include #include @@ -54,8 +53,4 @@ Layout TermSumController::createFunctionLayout(Shared::ExpiringPointernameLayout(); } -Poincare::Expression TermSumController::sumBetweenBounds(Shared::ExpiringPointer function, double start, double end, Poincare::Context * context) const { - return Poincare::Sum::Builder(function->expressionReduced(context).clone(), Poincare::Symbol::Builder(UCodePointUnknownX), Poincare::Float::Builder(start), Poincare::Float::Builder(end)); // Sum takes ownership of args -} - } diff --git a/apps/sequence/graph/term_sum_controller.h b/apps/sequence/graph/term_sum_controller.h index 5c58a602c..092c3377c 100644 --- a/apps/sequence/graph/term_sum_controller.h +++ b/apps/sequence/graph/term_sum_controller.h @@ -18,7 +18,6 @@ private: I18n::Message legendMessageAtStep(Step step) override; double cursorNextStep(double position, int direction) override; Poincare::Layout createFunctionLayout(Shared::ExpiringPointer function) override; - Poincare::Expression sumBetweenBounds(Shared::ExpiringPointer function, double start, double end, Poincare::Context * context) const override; }; } diff --git a/apps/sequence/sequence.cpp b/apps/sequence/sequence.cpp index b8c136c13..4c28c264a 100644 --- a/apps/sequence/sequence.cpp +++ b/apps/sequence/sequence.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include "../shared/poincare_helpers.h" @@ -190,6 +191,10 @@ T Sequence::approximateToNextRank(int n, SequenceContext * sqctx) const { } } +Expression Sequence::sumBetweenBounds(double start, double end, Poincare::Context * context) const { + return Poincare::Sum::Builder(expressionReduced(context).clone(), Poincare::Symbol::Builder(UCodePointUnknownX), Poincare::Float::Builder(start), Poincare::Float::Builder(end)); // Sum takes ownership of args +} + Sequence::SequenceRecordDataBuffer * Sequence::recordData() const { assert(!isNull()); Ion::Storage::Record::Data d = value(); diff --git a/apps/sequence/sequence.h b/apps/sequence/sequence.h index 850f501f1..619755ca6 100644 --- a/apps/sequence/sequence.h +++ b/apps/sequence/sequence.h @@ -66,6 +66,7 @@ public: } template T approximateToNextRank(int n, SequenceContext * sqctx) const; + Poincare::Expression sumBetweenBounds(double start, double end, Poincare::Context * context) const override; constexpr static int k_initialRankNumberOfDigits = 3; // m_initialRank is capped by 999 private: constexpr static const KDFont * k_layoutFont = KDFont::LargeFont; diff --git a/apps/shared/cartesian_function.cpp b/apps/shared/cartesian_function.cpp index d05608f87..514562239 100644 --- a/apps/shared/cartesian_function.cpp +++ b/apps/shared/cartesian_function.cpp @@ -2,6 +2,7 @@ #include "expression_model_store.h" #include "poincare_helpers.h" #include +#include #include #include #include @@ -322,6 +323,16 @@ Coordinate2D CartesianFunction::nextPointOfInterestFrom(double start, do return compute(expressionReduced(context), unknownX, start, step, max, context); } +Poincare::Expression CartesianFunction::sumBetweenBounds(double start, double end, Poincare::Context * context) const { + assert(plotType() == PlotType::Cartesian); + start = maxDouble(start, tMin()); + end = minDouble(end, tMax()); + return Poincare::Integral::Builder(expressionReduced(context).clone(), Poincare::Symbol::Builder(UCodePointUnknownX), Poincare::Float::Builder(start), Poincare::Float::Builder(end)); // Integral takes ownership of args + /* TODO: when we approximate integral, we might want to simplify the integral + * here. However, we might want to do it once for all x (to avoid lagging in + * the derivative table. */ +} + template Coordinate2D CartesianFunction::templatedApproximateAtParameter(float, Poincare::Context *) const; template Coordinate2D CartesianFunction::templatedApproximateAtParameter(double, Poincare::Context *) const; diff --git a/apps/shared/cartesian_function.h b/apps/shared/cartesian_function.h index 3e575bf38..1c5614fac 100644 --- a/apps/shared/cartesian_function.h +++ b/apps/shared/cartesian_function.h @@ -63,6 +63,8 @@ public: // Roots Poincare::Coordinate2D nextRootFrom(double start, double step, double max, Poincare::Context * context) const; Poincare::Coordinate2D nextIntersectionFrom(double start, double step, double max, Poincare::Context * context, Poincare::Expression e, double eDomainMin = -INFINITY, double eDomainMax = INFINITY) const; + // Integral + Poincare::Expression sumBetweenBounds(double start, double end, Poincare::Context * context) const override; private: constexpr static float k_polarParamRangeSearchNumberOfPoints = 100.0f; // This is ad hoc, no special justification typedef Poincare::Coordinate2D (*ComputePointOfInterest)(Poincare::Expression e, char * symbol, double start, double step, double max, Poincare::Context * context); diff --git a/apps/shared/function.h b/apps/shared/function.h index 0c55409bd..863502b78 100644 --- a/apps/shared/function.h +++ b/apps/shared/function.h @@ -51,6 +51,7 @@ public: // Evaluation virtual Poincare::Coordinate2D evaluateXYAtParameter(float t, Poincare::Context * context) const = 0; virtual Poincare::Coordinate2D evaluateXYAtParameter(double t, Poincare::Context * context) const = 0; + virtual Poincare::Expression sumBetweenBounds(double start, double end, Poincare::Context * context) const = 0; protected: /* FunctionRecordDataBuffer is the layout of the data buffer of Record * representing a Function. We want to avoid padding which would: diff --git a/apps/shared/sum_graph_controller.cpp b/apps/shared/sum_graph_controller.cpp index 199c67c12..c5b1703d7 100644 --- a/apps/shared/sum_graph_controller.cpp +++ b/apps/shared/sum_graph_controller.cpp @@ -139,7 +139,7 @@ void SumGraphController::reloadBannerView() { assert(!m_record.isNull()); ExpiringPointer function = myApp->functionStore()->modelForRecord(m_record); Poincare::Context * context = myApp->localContext(); - Poincare::Expression sum = sumBetweenBounds(function, m_startSum, endSum, context); + Poincare::Expression sum = function->sumBetweenBounds(m_startSum, endSum, context); result = PoincareHelpers::ApproximateToScalar(sum, context); functionLayout = createFunctionLayout(function); } else { diff --git a/apps/shared/sum_graph_controller.h b/apps/shared/sum_graph_controller.h index 4da12363a..6a7ba1b86 100644 --- a/apps/shared/sum_graph_controller.h +++ b/apps/shared/sum_graph_controller.h @@ -42,7 +42,6 @@ private: virtual I18n::Message legendMessageAtStep(Step step) = 0; virtual double cursorNextStep(double position, int direction) = 0; virtual Poincare::Layout createFunctionLayout(ExpiringPointer function) = 0; - virtual Poincare::Expression sumBetweenBounds(ExpiringPointer function, double start, double end, Poincare::Context * context) const = 0; class LegendView : public View { public: LegendView(SumGraphController * controller, InputEventHandlerDelegate * inputEventHandlerDelegate, CodePoint sumSymbol);