diff --git a/apps/graph/graph/extremum_graph_controller.cpp b/apps/graph/graph/extremum_graph_controller.cpp index cf3971b69..aa84d7e1f 100644 --- a/apps/graph/graph/extremum_graph_controller.cpp +++ b/apps/graph/graph/extremum_graph_controller.cpp @@ -1,7 +1,7 @@ #include "extremum_graph_controller.h" -#include "../app.h" +#include "../../shared/poincare_helpers.h" +#include -using namespace Shared; using namespace Poincare; namespace Graph { @@ -16,7 +16,11 @@ const char * MinimumGraphController::title() { } Coordinate2D MinimumGraphController::computeNewPointOfInterest(double start, double step, double max, Poincare::Context * context) { - return functionStore()->modelForRecord(m_record)->nextMinimumFrom(start, step, max, context); + // TODO The following three lines should be factored. + constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; + char unknownX[bufferSize]; + Poincare::SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); + return Shared::PoincareHelpers::NextMinimum(functionStore()->modelForRecord(m_record)->expressionReduced(context), unknownX, start, step, max, context); } MaximumGraphController::MaximumGraphController(Responder * parentResponder, GraphView * graphView, BannerView * bannerView, Shared::InteractiveCurveViewRange * curveViewRange, Shared::CurveViewCursor * cursor) : @@ -29,7 +33,11 @@ const char * MaximumGraphController::title() { } Coordinate2D MaximumGraphController::computeNewPointOfInterest(double start, double step, double max, Poincare::Context * context) { - return functionStore()->modelForRecord(m_record)->nextMaximumFrom(start, step, max, context); + // TODO The following three lines should be factored. + constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; + char unknownX[bufferSize]; + Poincare::SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); + return Shared::PoincareHelpers::NextMaximum(functionStore()->modelForRecord(m_record)->expressionReduced(context), unknownX, start, step, max, context); } } diff --git a/apps/graph/graph/intersection_graph_controller.cpp b/apps/graph/graph/intersection_graph_controller.cpp index 87f363fb7..8ef991990 100644 --- a/apps/graph/graph/intersection_graph_controller.cpp +++ b/apps/graph/graph/intersection_graph_controller.cpp @@ -1,7 +1,7 @@ #include "intersection_graph_controller.h" -#include "../app.h" #include "../../shared/poincare_helpers.h" #include +#include using namespace Shared; @@ -41,12 +41,16 @@ void IntersectionGraphController::reloadBannerView() { } Poincare::Coordinate2D IntersectionGraphController::computeNewPointOfInterest(double start, double step, double max, Poincare::Context * context) { + // TODO The following three lines should be factored. + constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; + char unknownX[bufferSize]; + Poincare::SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); Poincare::Coordinate2D result = Poincare::Coordinate2D(NAN, NAN); for (int i = 0; i < functionStore()->numberOfActiveFunctions(); i++) { Ion::Storage::Record record = functionStore()->activeRecordAtIndex(i); if (record != m_record) { Poincare::Expression e = functionStore()->modelForRecord(record)->expressionReduced(context); - Poincare::Coordinate2D intersection = functionStore()->modelForRecord(m_record)->nextIntersectionFrom(start, step, max, context, e); + Poincare::Coordinate2D intersection = Shared::PoincareHelpers::NextIntersection(functionStore()->modelForRecord(m_record)->expressionReduced(context), unknownX, start, step, max, context, e); if ((std::isnan(result.abscissa()) || std::fabs(intersection.abscissa()-start) < std::fabs(result.abscissa()-start)) && !std::isnan(intersection.abscissa())) { m_intersectedRecord = record; result = (std::isnan(result.abscissa()) || std::fabs(intersection.abscissa()-start) < std::fabs(result.abscissa()-start)) ? intersection : result; diff --git a/apps/graph/graph/preimage_graph_controller.cpp b/apps/graph/graph/preimage_graph_controller.cpp index 868b427b5..bf0785328 100644 --- a/apps/graph/graph/preimage_graph_controller.cpp +++ b/apps/graph/graph/preimage_graph_controller.cpp @@ -1,4 +1,6 @@ #include "preimage_graph_controller.h" +#include "../../shared/poincare_helpers.h" +#include namespace Graph { @@ -22,8 +24,12 @@ PreimageGraphController::PreimageGraphController( } Poincare::Coordinate2D PreimageGraphController::computeNewPointOfInterest(double start, double step, double max, Poincare::Context * context) { + // TODO The following three lines should be factored. + constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; + char unknownX[bufferSize]; + Poincare::SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); Poincare::Expression expression = Poincare::Float::Builder(m_image); - return functionStore()->modelForRecord(m_record)->nextIntersectionFrom(start, step, max, context, expression); + return Shared::PoincareHelpers::NextIntersection(functionStore()->modelForRecord(m_record)->expressionReduced(context), unknownX, start, step, max, context, expression); } } diff --git a/apps/graph/graph/root_graph_controller.cpp b/apps/graph/graph/root_graph_controller.cpp index 741a72961..e4062447a 100644 --- a/apps/graph/graph/root_graph_controller.cpp +++ b/apps/graph/graph/root_graph_controller.cpp @@ -1,5 +1,6 @@ #include "root_graph_controller.h" -#include "../app.h" +#include "../../shared/poincare_helpers.h" +#include using namespace Shared; using namespace Poincare; @@ -16,7 +17,11 @@ const char * RootGraphController::title() { } Coordinate2D RootGraphController::computeNewPointOfInterest(double start, double step, double max, Context * context) { - return Coordinate2D(functionStore()->modelForRecord(m_record)->nextRootFrom(start, step, max, context), 0.0); + // TODO The following three lines should be factored. + constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; + char unknownX[bufferSize]; + Poincare::SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); + return Coordinate2D(Shared::PoincareHelpers::NextRoot(functionStore()->modelForRecord(m_record)->expressionReduced(context), unknownX, start, step, max, context), 0.0); } } diff --git a/apps/shared/cartesian_function.cpp b/apps/shared/cartesian_function.cpp index a85bc818d..8e27cdb9e 100644 --- a/apps/shared/cartesian_function.cpp +++ b/apps/shared/cartesian_function.cpp @@ -104,34 +104,6 @@ double CartesianFunction::sumBetweenBounds(double start, double end, Poincare::C return PoincareHelpers::ApproximateToScalar(integral, context); } -Coordinate2D CartesianFunction::nextMinimumFrom(double start, double step, double max, Context * context) const { - constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; - char unknownX[bufferSize]; - SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); - return PoincareHelpers::NextMinimum(expressionReduced(context), unknownX, start, step, max, context); -} - -Coordinate2D CartesianFunction::nextMaximumFrom(double start, double step, double max, Context * context) const { - constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; - char unknownX[bufferSize]; - SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); - return PoincareHelpers::NextMaximum(expressionReduced(context), unknownX, start, step, max, context); -} - -double CartesianFunction::nextRootFrom(double start, double step, double max, Context * context) const { - constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; - char unknownX[bufferSize]; - SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); - return PoincareHelpers::NextRoot(expressionReduced(context), unknownX, start, step, max, context); -} - -Coordinate2D CartesianFunction::nextIntersectionFrom(double start, double step, double max, Poincare::Context * context, Expression e) const { - constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; - char unknownX[bufferSize]; - SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); - return PoincareHelpers::NextIntersection(expressionReduced(context), unknownX, start, step, max, context, e); -} - void * CartesianFunction::Model::expressionAddress(const Ion::Storage::Record * record) const { return (char *)record->value().buffer+sizeof(CartesianFunctionRecordDataBuffer); } diff --git a/apps/shared/cartesian_function.h b/apps/shared/cartesian_function.h index a671667f4..d45d54f64 100644 --- a/apps/shared/cartesian_function.h +++ b/apps/shared/cartesian_function.h @@ -30,12 +30,6 @@ public: double approximateDerivative(double x, Poincare::Context * context) const; // Integral double sumBetweenBounds(double start, double end, Poincare::Context * context) const override; - // Extremum - Poincare::Coordinate2D nextMinimumFrom(double start, double step, double max, Poincare::Context * context) const; - Poincare::Coordinate2D nextMaximumFrom(double start, double step, double max, Poincare::Context * context) const; - // Roots - double 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 expression) const; private: /* CartesianFunctionRecordDataBuffer is the layout of the data buffer of Record * representing a CartesianFunction. See comment on