some weird moving
This commit is contained in:
37
src/main/java/org/solovyev/util/math/MathEntity.java
Normal file
37
src/main/java/org/solovyev/util/math/MathEntity.java
Normal file
@@ -0,0 +1,37 @@
|
||||
package org.solovyev.util.math;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public enum MathEntity {
|
||||
|
||||
minus("-"),
|
||||
equals("="),
|
||||
factorial("!"),
|
||||
plus("+"),
|
||||
multiply("*"),
|
||||
divide("/"),
|
||||
power("^"),
|
||||
sin("sin"),
|
||||
asin("asin"),
|
||||
cos("cos"),
|
||||
acos("acos"),
|
||||
tg("tg"),
|
||||
atg("atg"),
|
||||
exp("exp"),
|
||||
log("log"),
|
||||
ln("ln"),
|
||||
mod("mod"),
|
||||
sqrt("sqrt");
|
||||
|
||||
@NotNull
|
||||
private final String text;
|
||||
|
||||
private MathEntity (@NotNull String text) {
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String getText() {
|
||||
return text;
|
||||
}
|
||||
}
|
79
src/main/java/org/solovyev/util/math/MathEntityType.java
Normal file
79
src/main/java/org/solovyev/util/math/MathEntityType.java
Normal file
@@ -0,0 +1,79 @@
|
||||
package org.solovyev.util.math;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public enum MathEntityType {
|
||||
|
||||
digit,
|
||||
constant,
|
||||
dot,
|
||||
function,
|
||||
unary_operation,
|
||||
binary_operation,
|
||||
group_symbols,
|
||||
group_symbol;
|
||||
|
||||
public static final List<Character> constants = Arrays.asList('e', 'π');
|
||||
|
||||
public static final List<Character> dots = Arrays.asList('.', ',');
|
||||
|
||||
public static final List<Character> unaryOperations = Arrays.asList('-', '=', '!');
|
||||
|
||||
public static final List<Character> binaryOperations = Arrays.asList('-', '+', '*', '×', '∙', '/', '^' );
|
||||
|
||||
public static final List<String> functions = Arrays.asList("sin", "asin", "cos", "acos", "tg", "atg", "log", "ln", "mod", "√");
|
||||
|
||||
public static final List<String> groupSymbols = Arrays.asList("[]", "()", "{}");
|
||||
|
||||
public static final List<Character> openGroupSymbols = Arrays.asList('[', '(', '{');
|
||||
|
||||
public static final List<Character> closeGroupSymbols = Arrays.asList(']', ')', '}');
|
||||
|
||||
public static final List<Character> singleGroupSymbols;
|
||||
static {
|
||||
final List<Character> list = new ArrayList<Character>();
|
||||
list.addAll(openGroupSymbols);
|
||||
list.addAll(closeGroupSymbols);
|
||||
singleGroupSymbols = Collections.unmodifiableList(list);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static MathEntityType getType( @NotNull String s ) {
|
||||
MathEntityType result = null;
|
||||
|
||||
if ( s.length() == 1 ) {
|
||||
char ch = s.charAt(0);
|
||||
|
||||
if ( Character.isDigit(ch) ) {
|
||||
result = MathEntityType.digit;
|
||||
} else if ( unaryOperations.contains(ch) ) {
|
||||
result = MathEntityType.unary_operation;
|
||||
} else if ( binaryOperations.contains(ch) ) {
|
||||
result = MathEntityType.binary_operation;
|
||||
} else if ( singleGroupSymbols.contains(ch) ) {
|
||||
result = MathEntityType.group_symbol;
|
||||
} else if ( constants.contains(ch) ) {
|
||||
result = MathEntityType.constant;
|
||||
} else if ( dots.contains(ch) ) {
|
||||
result = MathEntityType.dot;
|
||||
}
|
||||
}
|
||||
|
||||
if ( result == null ) {
|
||||
if ( functions.contains(s) ) {
|
||||
result = MathEntityType.function;
|
||||
} else if ( groupSymbols.contains(s) ) {
|
||||
result = MathEntityType.group_symbols;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
102
src/main/java/org/solovyev/util/math/MathUtils.java
Normal file
102
src/main/java/org/solovyev/util/math/MathUtils.java
Normal file
@@ -0,0 +1,102 @@
|
||||
package org.solovyev.util.math;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class MathUtils {
|
||||
|
||||
public static final float MIN_AMOUNT = 0.05f;
|
||||
|
||||
public static double round(@NotNull Double value, int numberOfFractionDigits) {
|
||||
double roundFactor = Math.pow(10, numberOfFractionDigits);
|
||||
|
||||
if (value < Double.MAX_VALUE / roundFactor) {
|
||||
return ((double)Math.round(value * roundFactor)) / roundFactor;
|
||||
} else {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
public static float getDistance(@NotNull Point2d startPoint,
|
||||
@NotNull Point2d endPoint) {
|
||||
return getNorm(subtract(endPoint, startPoint));
|
||||
}
|
||||
|
||||
public static Point2d subtract(@NotNull Point2d p1, @NotNull Point2d p2) {
|
||||
return new Point2d(p1.getX() - p2.getX(), p1.getY() - p2.getY());
|
||||
}
|
||||
|
||||
public static Point2d sum(@NotNull Point2d p1, @NotNull Point2d p2) {
|
||||
return new Point2d(p1.getX() + p2.getX(), p1.getY() + p2.getY());
|
||||
}
|
||||
|
||||
public static float getNorm(@NotNull Point2d point) {
|
||||
return (float) Math.pow(
|
||||
Math.pow(point.getX(), 2) + Math.pow(point.getY(), 2), 0.5);
|
||||
}
|
||||
|
||||
public static float getAngle(@NotNull Point2d startPoint,
|
||||
@NotNull Point2d axisEndPoint, @NotNull Point2d endPoint) {
|
||||
final Point2d axisVector = subtract(axisEndPoint, startPoint);
|
||||
final Point2d vector = subtract(endPoint, startPoint);
|
||||
|
||||
double a_2 = Math.pow(getDistance(vector, axisVector), 2);
|
||||
double b = getNorm(vector);
|
||||
double b_2 = Math.pow(b, 2);
|
||||
double c = getNorm(axisVector);
|
||||
double c_2 = Math.pow(c, 2);
|
||||
|
||||
return (float) Math.acos((-a_2 + b_2 + c_2) / (2 * b * c));
|
||||
}
|
||||
|
||||
public static double countMean(@NotNull List<Double> objects) {
|
||||
|
||||
double sum = 0d;
|
||||
for (Double object : objects) {
|
||||
sum += object;
|
||||
}
|
||||
|
||||
return objects.size() == 0 ? 0d : (sum / objects.size());
|
||||
}
|
||||
|
||||
public static double countStandardDeviation(@NotNull Double mean, @NotNull List<Double> objects) {
|
||||
double sum = 0d;
|
||||
|
||||
for (Double object : objects) {
|
||||
sum += Math.pow(object - mean, 2);
|
||||
}
|
||||
|
||||
return objects.size() == 0 ? 0d : Math.sqrt(sum / objects.size());
|
||||
}
|
||||
|
||||
public static StatData getStatData(@NotNull List<Double> objects) {
|
||||
|
||||
final double mean = countMean(objects);
|
||||
final double standardDeviation = countStandardDeviation(mean, objects);
|
||||
|
||||
return new StatData(mean, standardDeviation);
|
||||
}
|
||||
|
||||
public static class StatData {
|
||||
|
||||
private final double mean;
|
||||
|
||||
private final double standardDeviation;
|
||||
|
||||
public StatData(double mean, double standardDeviation) {
|
||||
this.mean = mean;
|
||||
this.standardDeviation = standardDeviation;
|
||||
}
|
||||
|
||||
public double getMean() {
|
||||
return mean;
|
||||
}
|
||||
|
||||
public double getStandardDeviation() {
|
||||
return standardDeviation;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
37
src/main/java/org/solovyev/util/math/Point2d.java
Normal file
37
src/main/java/org/solovyev/util/math/Point2d.java
Normal file
@@ -0,0 +1,37 @@
|
||||
package org.solovyev.util.math;
|
||||
|
||||
public class Point2d {
|
||||
|
||||
private float x = 0;
|
||||
|
||||
private float y = 0;
|
||||
|
||||
public Point2d() {
|
||||
}
|
||||
|
||||
public Point2d( float x, float y ) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public float getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setX(float x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public float getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void setY(float y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Point2d [x=" + x + ", y=" + y + "]";
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user