From 0acf3681e66949205793b4d810c586b83ae2ad44 Mon Sep 17 00:00:00 2001
From: arnaudlabourel <arnaud.labourel@univ-amu.fr>
Date: Mon, 20 Sep 2021 15:23:18 +0200
Subject: [PATCH] Correction des formules

---
 src/main/java/formula/Addition.java         | 17 ++++++++++++++
 src/main/java/formula/BinaryOperation.java  | 25 +++++++++++++++++++++
 src/main/java/formula/Constant.java         | 13 +++++------
 src/main/java/formula/Cosine.java           | 17 ++++++++++++++
 src/main/java/formula/Division.java         | 19 ++++++++++++++++
 src/main/java/formula/Exponential.java      | 17 ++++++++++++++
 src/main/java/formula/Logarithm.java        | 17 ++++++++++++++
 src/main/java/formula/Multiplication.java   | 18 +++++++++++++++
 src/main/java/formula/Opposite.java         | 17 ++++++++++++++
 src/main/java/formula/Sine.java             | 17 ++++++++++++++
 src/main/java/formula/Subtraction.java      | 17 ++++++++++++++
 src/main/java/formula/UnaryOperation.java   | 23 +++++++++++++++++++
 src/main/java/formula/VariableX.java        | 18 +++++++++++++++
 src/main/java/viewer/FunctionList.java      | 10 ++++++---
 src/main/java/viewer/MainAppController.java |  1 -
 15 files changed, 234 insertions(+), 12 deletions(-)
 create mode 100644 src/main/java/formula/Addition.java
 create mode 100644 src/main/java/formula/BinaryOperation.java
 create mode 100644 src/main/java/formula/Cosine.java
 create mode 100644 src/main/java/formula/Division.java
 create mode 100644 src/main/java/formula/Exponential.java
 create mode 100644 src/main/java/formula/Logarithm.java
 create mode 100644 src/main/java/formula/Multiplication.java
 create mode 100644 src/main/java/formula/Opposite.java
 create mode 100644 src/main/java/formula/Sine.java
 create mode 100644 src/main/java/formula/Subtraction.java
 create mode 100644 src/main/java/formula/UnaryOperation.java
 create mode 100644 src/main/java/formula/VariableX.java

diff --git a/src/main/java/formula/Addition.java b/src/main/java/formula/Addition.java
new file mode 100644
index 0000000..2f332a7
--- /dev/null
+++ b/src/main/java/formula/Addition.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Addition extends BinaryOperation {
+  public Addition(Formula leftMember, Formula rightMember) {
+    super(leftMember, rightMember, "+");
+  }
+
+  @Override
+  protected double compute(double leftValue, double rightValue) {
+    return leftValue + rightValue;
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Addition(leftMember.derivative(), rightMember.derivative());
+  }
+}
diff --git a/src/main/java/formula/BinaryOperation.java b/src/main/java/formula/BinaryOperation.java
new file mode 100644
index 0000000..caccbbe
--- /dev/null
+++ b/src/main/java/formula/BinaryOperation.java
@@ -0,0 +1,25 @@
+package formula;
+
+public abstract class BinaryOperation implements Formula {
+  final Formula leftMember;
+  final Formula rightMember;
+  final String operatorSymbol;
+
+  public BinaryOperation(Formula leftMember, Formula rightMember, String operatorSymbol) {
+    this.leftMember = leftMember;
+    this.rightMember = rightMember;
+    this.operatorSymbol = operatorSymbol;
+  }
+
+  @Override
+  public String toString() {
+    return "(" + leftMember + " " + operatorSymbol + " " + rightMember + ")";
+  }
+
+  @Override
+  public double eval(double xValue) {
+    return compute(leftMember.eval(xValue), rightMember.eval(xValue));
+  }
+
+  protected abstract double compute(double leftValue, double rightValue);
+}
diff --git a/src/main/java/formula/Constant.java b/src/main/java/formula/Constant.java
index 12359a7..a4e9e5e 100644
--- a/src/main/java/formula/Constant.java
+++ b/src/main/java/formula/Constant.java
@@ -4,10 +4,10 @@ import java.util.HashMap;
 
 public class Constant implements Formula {
 
-  private double value;
+  private final double value;
 
   public Constant(double value) {
-    // TODO : change the code.
+   this.value = value;
   }
 
   /**
@@ -18,8 +18,7 @@ public class Constant implements Formula {
    */
   @Override
   public double eval(double xValue) {
-    // TODO : change the code.
-    return 0;
+    return value;
   }
 
   /**
@@ -29,8 +28,7 @@ public class Constant implements Formula {
    */
   @Override
   public Formula derivative() {
-    // TODO : change the code.
-    return this;
+    return new Constant(0);
   }
 
   /**
@@ -40,8 +38,7 @@ public class Constant implements Formula {
    */
   @Override
   public String toString() {
-    // TODO : change the code.
-    return "toto";
+    return Double.toString(value);
   }
 
   /**
diff --git a/src/main/java/formula/Cosine.java b/src/main/java/formula/Cosine.java
new file mode 100644
index 0000000..5108eef
--- /dev/null
+++ b/src/main/java/formula/Cosine.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Cosine extends UnaryOperation {
+  public Cosine(Formula member) {
+    super(member, "cos");
+  }
+
+  @Override
+  protected double compute(double value) {
+    return Math.cos(value);
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Opposite(new Multiplication(member.derivative(), new Sine(member)));
+  }
+}
diff --git a/src/main/java/formula/Division.java b/src/main/java/formula/Division.java
new file mode 100644
index 0000000..528bac9
--- /dev/null
+++ b/src/main/java/formula/Division.java
@@ -0,0 +1,19 @@
+package formula;
+
+public class Division extends BinaryOperation {
+  public Division(Formula dividend, Formula divisor) {
+    super(dividend, divisor, "/");
+  }
+
+  @Override
+  protected double compute(double leftValue, double rightValue) {
+    return leftValue/rightValue;
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Division(new Subtraction(new Multiplication(leftMember.derivative(), rightMember),
+            new Multiplication(leftMember, rightMember.derivative())),
+            new Multiplication(rightMember, rightMember));
+  }
+}
diff --git a/src/main/java/formula/Exponential.java b/src/main/java/formula/Exponential.java
new file mode 100644
index 0000000..7fdc0e8
--- /dev/null
+++ b/src/main/java/formula/Exponential.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Exponential extends UnaryOperation {
+  public Exponential(Formula member) {
+    super(member, "e^");
+  }
+
+  @Override
+  protected double compute(double value) {
+    return Math.exp(value);
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Multiplication(member.derivative(), new Exponential(member));
+  }
+}
diff --git a/src/main/java/formula/Logarithm.java b/src/main/java/formula/Logarithm.java
new file mode 100644
index 0000000..963c3b9
--- /dev/null
+++ b/src/main/java/formula/Logarithm.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Logarithm extends UnaryOperation {
+  public Logarithm(Formula member) {
+    super(member, "log");
+  }
+
+  @Override
+  protected double compute(double value) {
+    return Math.log(value);
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Division(member.derivative(), member);
+  }
+}
diff --git a/src/main/java/formula/Multiplication.java b/src/main/java/formula/Multiplication.java
new file mode 100644
index 0000000..ebef51f
--- /dev/null
+++ b/src/main/java/formula/Multiplication.java
@@ -0,0 +1,18 @@
+package formula;
+
+public class Multiplication extends BinaryOperation {
+  public Multiplication(Formula leftMember, Formula rightMember) {
+    super(leftMember, rightMember, "*");
+  }
+
+  @Override
+  protected double compute(double leftValue, double rightValue) {
+    return leftValue * rightValue;
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Addition(new Multiplication(leftMember.derivative(), rightMember),
+            new Multiplication(leftMember, rightMember.derivative()));
+  }
+}
diff --git a/src/main/java/formula/Opposite.java b/src/main/java/formula/Opposite.java
new file mode 100644
index 0000000..1402959
--- /dev/null
+++ b/src/main/java/formula/Opposite.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Opposite extends UnaryOperation{
+  public Opposite(Formula member) {
+    super(member, "-");
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Opposite(member.derivative());
+  }
+
+  @Override
+  protected double compute(double value) {
+    return -value;
+  }
+}
diff --git a/src/main/java/formula/Sine.java b/src/main/java/formula/Sine.java
new file mode 100644
index 0000000..e2e4ace
--- /dev/null
+++ b/src/main/java/formula/Sine.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Sine extends UnaryOperation {
+  public Sine(Formula member) {
+    super(member, "sin");
+  }
+
+  @Override
+  protected double compute(double value) {
+    return Math.sin(value);
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Multiplication(member.derivative(), new Cosine(member));
+  }
+}
diff --git a/src/main/java/formula/Subtraction.java b/src/main/java/formula/Subtraction.java
new file mode 100644
index 0000000..e52c052
--- /dev/null
+++ b/src/main/java/formula/Subtraction.java
@@ -0,0 +1,17 @@
+package formula;
+
+public class Subtraction extends BinaryOperation {
+  public Subtraction(Formula subtrahend, Formula minuend) {
+    super(subtrahend, minuend, "-");
+  }
+
+  @Override
+  protected double compute(double leftValue, double rightValue) {
+    return leftValue - rightValue;
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Subtraction(leftMember.derivative(), rightMember.derivative());
+  }
+}
diff --git a/src/main/java/formula/UnaryOperation.java b/src/main/java/formula/UnaryOperation.java
new file mode 100644
index 0000000..f1bb7b9
--- /dev/null
+++ b/src/main/java/formula/UnaryOperation.java
@@ -0,0 +1,23 @@
+package formula;
+
+public abstract class UnaryOperation implements Formula {
+  protected final Formula member;
+  private final String symbol;
+
+  public UnaryOperation(Formula member, String symbol) {
+    this.member = member;
+    this.symbol = symbol;
+  }
+
+  @Override
+  public double eval(double xValue) {
+    return compute(member.eval(xValue));
+  }
+
+  protected abstract double compute(double value);
+
+  @Override
+  public String toString() {
+    return  symbol + "(" + member + ")";
+  }
+}
diff --git a/src/main/java/formula/VariableX.java b/src/main/java/formula/VariableX.java
new file mode 100644
index 0000000..3ecbe56
--- /dev/null
+++ b/src/main/java/formula/VariableX.java
@@ -0,0 +1,18 @@
+package formula;
+
+public class VariableX implements Formula {
+  @Override
+  public double eval(double xValue) {
+    return xValue;
+  }
+
+  @Override
+  public String toString() {
+    return "x";
+  }
+
+  @Override
+  public Formula derivative() {
+    return new Constant(1);
+  }
+}
diff --git a/src/main/java/viewer/FunctionList.java b/src/main/java/viewer/FunctionList.java
index 68d0c34..cca4709 100644
--- a/src/main/java/viewer/FunctionList.java
+++ b/src/main/java/viewer/FunctionList.java
@@ -1,6 +1,6 @@
 package viewer;
 
-import formula.Constant;
+import formula.*;
 import javafx.scene.chart.XYChart;
 
 import java.util.ArrayList;
@@ -19,8 +19,12 @@ class FunctionList {
     this.lowerBound = functionChart.getLowerBound();
     this.upperBound = functionChart.getUpperBound();
 
-    PlottableFunction function = new PlottableFunction(new Constant(1), "f");
-    addFunctionAndItsDerivative(function);
+    List<PlottableFunction> functions = List.of(new PlottableFunction(new Logarithm(new VariableX()),"f"),
+            new PlottableFunction(new Multiplication(new VariableX(), new Constant(3)), "g"),
+            new PlottableFunction(new Division(new Constant(1), new VariableX()), "h"),
+            new PlottableFunction(new Cosine(new Multiplication(new Constant(2), new VariableX())), "a"),
+            new PlottableFunction(new Exponential(new Multiplication(new Constant(2), new VariableX())), "a"));
+    addFunctionsAndTheirDerivative(functions);
   }
 
   void toggleFunction(PlottableFunction function) {
diff --git a/src/main/java/viewer/MainAppController.java b/src/main/java/viewer/MainAppController.java
index 329cd94..fa24019 100644
--- a/src/main/java/viewer/MainAppController.java
+++ b/src/main/java/viewer/MainAppController.java
@@ -45,7 +45,6 @@ public class MainAppController implements Initializable {
     Button button = new Button(function.toString());
     addButton(button);
     button.setOnAction(event -> toggleFunction(function));
-    toggleFunction(function);
   }
 
   private void toggleFunction(PlottableFunction function){
-- 
GitLab