From fa5902dcd2e5d23172ce06defb22b4927a940fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Tue, 15 Oct 2019 17:17:40 +0200 Subject: [PATCH] [apps/calculation] Calculation: add a methods additionalOuput --- apps/calculation/calculation.cpp | 21 +++++++++++++++++++++ apps/calculation/calculation.h | 14 ++++++++++++++ poincare/include/poincare/expression.h | 5 ++--- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index 711408b3e..5590a6b56 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -213,4 +213,25 @@ Calculation::EqualSign Calculation::exactAndApproximateDisplayedOutputsAreEqual( } } +Calculation::AdditionalOutput Calculation::additionalOuput(Context * context) { + ExpressionNode::Type type = exactOutput().type(); + if (type == ExpressionNode::Type::Rational) { + return AdditionalOutput::BaseRepresentation; + } + Preferences * preferences = Preferences::sharedPreferences(); + Evaluation e = approximateOutput(context).approximateToEvaluation(context, preferences->complexFormat(), preferences->angleUnit()); + if (e.type() == EvaluationNode::Type::MatrixComplex) { + return AdditionalOutput::None; + } + Complex ec = static_cast &>(e); + // return AdditionalOutput::Matrix + if ((type == ExpressionNode::Type::Cosine || type == ExpressionNode::Type::Sine) && ec.imag() == 0.0f) { + return AdditionalOutput::TrigonometryCircle; + } + if (ec.imag() != 0.0f) { + return AdditionalOutput::ComplexPlan; + } + return AdditionalOutput::None; +} + } diff --git a/apps/calculation/calculation.h b/apps/calculation/calculation.h index 89dbd52a1..e01aab748 100644 --- a/apps/calculation/calculation.h +++ b/apps/calculation/calculation.h @@ -33,6 +33,14 @@ public: ExactAndApproximateToggle }; + enum class AdditionalOutput : uint8_t { + None, + ComplexPlan, + TrigonometryCircle, + BaseRepresentation + //Matrix + }; + /* It is not really the minimal size, but it clears enough space for most * calculations instead of clearing less space, then fail to serialize, clear * more space, fail to serialize, clear more space, etc., until reaching @@ -67,10 +75,16 @@ public: Poincare::Layout createExactOutputLayout(); Poincare::Layout createApproximateOutputLayout(Poincare::Context * context); + // Memoization of height KDCoordinate height(Poincare::Context * context, bool expanded = false); + + // Displayed output DisplayOutput displayOutput(Poincare::Context * context); bool shouldOnlyDisplayExactOutput(); EqualSign exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context); + + // Additional outputs + AdditionalOutput additionalOuput(Poincare::Context * context); private: static constexpr KDCoordinate k_heightComputationFailureHeight = 50; /* Buffers holding text expressions have to be longer than the text written diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 05e649fb7..db677b012 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -245,6 +245,8 @@ public: Coordinate2D nextMaximum(const char * symbol, double start, double step, double max, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; double nextRoot(const char * symbol, double start, double step, double max, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; Coordinate2D nextIntersection(const char * symbol, double start, double step, double max, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit, const Expression expression) const; + template Evaluation approximateToEvaluation(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; + /* This class is meant to contain data about named functions (e.g. sin, tan...) * in one place: their name, their number of children and a pointer to a builder. @@ -375,9 +377,6 @@ private: Expression shallowReduceUsingApproximation(ExpressionNode::ReductionContext reductionContext); Expression defaultShallowBeautify() { return *this; } - /* Approximation */ - template Evaluation approximateToEvaluation(Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const; - /* Properties */ int defaultGetPolynomialCoefficients(Context * context, const char * symbol, Expression expression[]) const;