package com.hypixel.hytale.procedurallib.logic.cell;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public enum DistanceCalculationMode {
EUCLIDEAN(new PointDistanceFunction() {
public double distance2D(double deltaX, double deltaY) {
return deltaX * deltaX + deltaY * deltaY;
}
public double distance3D(double deltaX, double deltaY, double deltaZ) {
return deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;
}
@Nonnull
public String toString() {
return "EuclideanPointDistanceFunction{}";
}
}),
MANHATTAN(new PointDistanceFunction() {
public double distance2D(double deltaX, double deltaY) {
return Math.abs(deltaX) + Math.abs(deltaY);
}
public double distance3D(double deltaX, double deltaY, double deltaZ) {
return Math.abs(deltaX) + Math.abs(deltaY) + Math.abs(deltaZ);
}
@Nonnull
public String toString() {
return "ManhattanPointDistanceFunction{}";
}
}),
NATURAL(new PointDistanceFunction() {
public double distance2D(double deltaX, double deltaY) {
return Math.abs(deltaX) + Math.abs(deltaY) + deltaX * deltaX + deltaY * deltaY;
}
public double distance3D(double deltaX, double deltaY, double deltaZ) {
return Math.abs(deltaX) + Math.abs(deltaY) + Math.abs(deltaZ) + deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;
}
@Nonnull
public String toString() {
return "NaturalPointDistanceFunction{}";
}
}),
MAX(new PointDistanceFunction() {
public double distance2D(double deltaX, double deltaY) {
return Math.max(Math.abs(deltaX), Math.abs(deltaY));
}
public double distance3D(double deltaX, double deltaY, double deltaZ) {
return Math.max(Math.abs(deltaX), Math.max(Math.abs(deltaY), Math.abs(deltaZ)));
}
@Nonnull
public String toString() {
return "MaxPointDistanceFunction{}";
}
});
protected static final DistanceCalculationMode[] VALUES = values();
private final PointDistanceFunction function;
private DistanceCalculationMode(PointDistanceFunction function) {
this.function = function;
}
public PointDistanceFunction getFunction() {
return this.function;
}
@Nullable
public static DistanceCalculationMode from(PointDistanceFunction function) {
for(DistanceCalculationMode mode : VALUES) {
if (mode.function == function) {
return mode;
}
}
return null;
}
}