Add implementation of Fraction and Angle.
This commit is contained in:
76
src/main/java/fr/insa/gei/angles/Angle.java
Normal file
76
src/main/java/fr/insa/gei/angles/Angle.java
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
package fr.insa.gei.angles;
|
||||||
|
|
||||||
|
public class Angle implements IAngle {
|
||||||
|
|
||||||
|
private double radians;
|
||||||
|
|
||||||
|
protected Angle(double radians) {
|
||||||
|
this.radians = radians;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double toDegrees() {
|
||||||
|
return Math.toDegrees(this.radians);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double toRadians() {
|
||||||
|
return this.radians;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double cos() {
|
||||||
|
return Math.cos(this.radians);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double sin() {
|
||||||
|
return Math.sin(this.radians);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double tan() {
|
||||||
|
return Math.tan(this.radians);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IAngle add(IAngle other) {
|
||||||
|
return new Angle(this.radians + other.toRadians());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IAngle sub(IAngle other) {
|
||||||
|
return new Angle(this.radians - other.toRadians());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IAngle mul(double factor) {
|
||||||
|
return new Angle(this.radians * factor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IAngle div(double divisor) {
|
||||||
|
return new Angle(this.radians / divisor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(IAngle o) {
|
||||||
|
return Double.compare(this.radians, o.toRadians());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null || getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
Angle other = (Angle) obj;
|
||||||
|
return Double.compare(this.radians, other.radians) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("%.2frad", this.radians);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
15
src/main/java/fr/insa/gei/angles/AngleFactory.java
Normal file
15
src/main/java/fr/insa/gei/angles/AngleFactory.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package fr.insa.gei.angles;
|
||||||
|
|
||||||
|
public class AngleFactory implements IAngleFactory<Angle> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Angle fromRadians(double radians) {
|
||||||
|
return new Angle(radians);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Angle fromDegrees(double degrees) {
|
||||||
|
return new Angle(Math.toRadians(degrees));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package fr.insa.gei.angles;
|
package fr.insa.gei.angles;
|
||||||
|
|
||||||
public interface IAngleFactory<Angle extends IAngle> {
|
public interface IAngleFactory<GAngle extends IAngle> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new Angle object using the given value in radians.
|
* Construct a new Angle object using the given value in radians.
|
||||||
@@ -8,7 +8,7 @@ public interface IAngleFactory<Angle extends IAngle> {
|
|||||||
* @param radians Value of the angle in radians.
|
* @param radians Value of the angle in radians.
|
||||||
* @return a new Angle object.
|
* @return a new Angle object.
|
||||||
*/
|
*/
|
||||||
public Angle fromRadians(double radians);
|
public GAngle fromRadians(double radians);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new Angle object using the given value in degrees.
|
* Construct a new Angle object using the given value in degrees.
|
||||||
@@ -16,7 +16,7 @@ public interface IAngleFactory<Angle extends IAngle> {
|
|||||||
* @param degrees Value of the angle in degrees.
|
* @param degrees Value of the angle in degrees.
|
||||||
* @return a new Angle object.
|
* @return a new Angle object.
|
||||||
*/
|
*/
|
||||||
public Angle fromDegrees(double degrees);
|
public GAngle fromDegrees(double degrees);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new Angle object corresponding to the arc cosine of the given
|
* Construct a new Angle object corresponding to the arc cosine of the given
|
||||||
@@ -25,7 +25,7 @@ public interface IAngleFactory<Angle extends IAngle> {
|
|||||||
* @param a Value for which to compute the arc cosine.
|
* @param a Value for which to compute the arc cosine.
|
||||||
* @return a new Angle object.
|
* @return a new Angle object.
|
||||||
*/
|
*/
|
||||||
public default Angle acos(double a) {
|
public default GAngle acos(double a) {
|
||||||
return fromRadians(Math.acos(a));
|
return fromRadians(Math.acos(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ public interface IAngleFactory<Angle extends IAngle> {
|
|||||||
* @param a Value for which to compute the arc sine.
|
* @param a Value for which to compute the arc sine.
|
||||||
* @return a new Angle object.
|
* @return a new Angle object.
|
||||||
*/
|
*/
|
||||||
public default Angle asin(double a) {
|
public default GAngle asin(double a) {
|
||||||
return fromRadians(Math.asin(a));
|
return fromRadians(Math.asin(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ public interface IAngleFactory<Angle extends IAngle> {
|
|||||||
* @param a Value for which to compute the arc tangent.
|
* @param a Value for which to compute the arc tangent.
|
||||||
* @return a new Angle object.
|
* @return a new Angle object.
|
||||||
*/
|
*/
|
||||||
public default Angle atan(double a) {
|
public default GAngle atan(double a) {
|
||||||
return fromRadians(Math.atan(a));
|
return fromRadians(Math.atan(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ public interface IAngleFactory<Angle extends IAngle> {
|
|||||||
* @param x Value for which to compute the arc tangent.
|
* @param x Value for which to compute the arc tangent.
|
||||||
* @return a new Angle object.
|
* @return a new Angle object.
|
||||||
*/
|
*/
|
||||||
public default Angle atan2(double y, double x) {
|
public default GAngle atan2(double y, double x) {
|
||||||
return fromRadians(Math.atan2(y, x));
|
return fromRadians(Math.atan2(y, x));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
135
src/main/java/fr/insa/gei/fractions/Fraction.java
Normal file
135
src/main/java/fr/insa/gei/fractions/Fraction.java
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
package fr.insa.gei.fractions;
|
||||||
|
|
||||||
|
public class Fraction implements IFraction {
|
||||||
|
|
||||||
|
private final int numerator;
|
||||||
|
private final int denominator;
|
||||||
|
|
||||||
|
protected Fraction(int numerator, int denominator) {
|
||||||
|
if (denominator == 0) {
|
||||||
|
throw new IllegalArgumentException("Denominator cannot be zero.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (denominator < 0) {
|
||||||
|
numerator = -numerator;
|
||||||
|
denominator = -denominator;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int gcd = this.gcd(Math.abs(numerator), Math.abs(denominator));
|
||||||
|
|
||||||
|
this.numerator = numerator / gcd;
|
||||||
|
this.denominator = denominator / gcd;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int gcd(int a, int b) {
|
||||||
|
while (b != 0) {
|
||||||
|
final int temp = b;
|
||||||
|
b = a % b;
|
||||||
|
a = temp;
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNumerator() {
|
||||||
|
return this.numerator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDenominator() {
|
||||||
|
return this.denominator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFraction add(IFraction f) {
|
||||||
|
return new Fraction(
|
||||||
|
this.numerator * f.getDenominator() + f.getNumerator() * this.denominator,
|
||||||
|
this.denominator * f.getDenominator());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFraction add(int value) {
|
||||||
|
return new Fraction(
|
||||||
|
this.numerator + value * this.denominator,
|
||||||
|
this.denominator);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFraction sub(IFraction f) {
|
||||||
|
return this.add(f.neg());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFraction sub(int value) {
|
||||||
|
return this.add(-value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFraction mul(IFraction f) {
|
||||||
|
return new Fraction(
|
||||||
|
this.numerator * f.getNumerator(),
|
||||||
|
this.denominator * f.getDenominator());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFraction mul(int value) {
|
||||||
|
return new Fraction(
|
||||||
|
this.numerator * value,
|
||||||
|
this.denominator);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFraction div(IFraction f) {
|
||||||
|
return new Fraction(
|
||||||
|
this.numerator * f.getDenominator(),
|
||||||
|
this.denominator * f.getNumerator());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFraction div(int value) {
|
||||||
|
return new Fraction(
|
||||||
|
this.numerator,
|
||||||
|
this.denominator * value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFraction inv() {
|
||||||
|
return new Fraction(
|
||||||
|
this.denominator,
|
||||||
|
this.numerator);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFraction neg() {
|
||||||
|
return new Fraction(
|
||||||
|
-this.numerator,
|
||||||
|
this.denominator);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double toDouble() {
|
||||||
|
return (double) this.numerator / this.denominator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return this.numerator + "/" + this.denominator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null || getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
Fraction other = (Fraction) obj;
|
||||||
|
return this.numerator * other.denominator == other.numerator * this.denominator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(IFraction other) {
|
||||||
|
// a/b cmp c/d <=> a*d cmp b*c (because both b and d are positive)
|
||||||
|
return Integer.compare(this.numerator * other.getDenominator(), this.denominator * other.getNumerator());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
10
src/main/java/fr/insa/gei/fractions/FractionFactory.java
Normal file
10
src/main/java/fr/insa/gei/fractions/FractionFactory.java
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package fr.insa.gei.fractions;
|
||||||
|
|
||||||
|
public class FractionFactory implements IFractionFactory<Fraction> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Fraction create(int numerator, int denominator) {
|
||||||
|
return new Fraction(numerator, denominator);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package fr.insa.gei.fractions;
|
package fr.insa.gei.fractions;
|
||||||
|
|
||||||
public interface IFractionFactory<Fraction extends IFraction> {
|
public interface IFractionFactory<GFraction extends IFraction> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a fraction with given numerator and denominator.
|
* Creates a fraction with given numerator and denominator.
|
||||||
@@ -9,7 +9,7 @@ public interface IFractionFactory<Fraction extends IFraction> {
|
|||||||
* @param denominator the denominator of the fraction
|
* @param denominator the denominator of the fraction
|
||||||
* @return a new fraction instance
|
* @return a new fraction instance
|
||||||
*/
|
*/
|
||||||
public Fraction create(int numerator, int denominator);
|
public GFraction create(int numerator, int denominator);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a fraction with given numerator and denominator equal to 1.
|
* Creates a fraction with given numerator and denominator equal to 1.
|
||||||
@@ -17,7 +17,7 @@ public interface IFractionFactory<Fraction extends IFraction> {
|
|||||||
* @param numerator the numerator of the fraction
|
* @param numerator the numerator of the fraction
|
||||||
* @return a new fraction instance
|
* @return a new fraction instance
|
||||||
*/
|
*/
|
||||||
public default Fraction create(int numerator) {
|
public default GFraction create(int numerator) {
|
||||||
return this.create(numerator, 1);
|
return this.create(numerator, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user