Многоугольник треугольника имеет массив vertices
, содержащий 3x Vector3D
экземпляров.Метод должен найти крайнее значение (min / max) на оси (x, y или z) для треугольника.
Например, треугольник A(0, 0, 3) B(1, 2, 3) C(2, 2, -4)
имеет минимальное значение -4
на оси z.
Текущая реализация выглядит следующим образом:
public class Triangle implements Iterable<Vector3D> {
private final Vector3D[] vertices;
private final double kEpsilon = 1e-8;
public Triangle(Vector3D... vertices) {
Preconditions.checkArgument(vertices.length == 3);
this.vertices = vertices;
}
public double getExtremeValueForAxis(int axis) {
var minimum = getValueByAxisIndex(Arrays.stream(vertices).min((v, vOther) -> {
var vValueOnAxis = getValueByAxisIndex(v, axis);
var vOtherValueOnAxis = getValueByAxisIndex(vOther, axis);
return Double.compare(vValueOnAxis, vOtherValueOnAxis);
}).get(), axis);
return minimum;
}
private static double getValueByAxisIndex(final Vector3D vertex, final int axis) {
switch(axis) {
case 0: return vertex.getX();
case 1: return vertex.getY();
case 2: return vertex.getZ();
default: throw new IllegalArgumentException("Axis needs to be in 3D space!");
}
}
}
Как разрешить пользователю искать минимальное / максимальное значение, передавая функцию Optional<T> min(Comparator<? super T> comparator);
или Optional<T> max(Comparator<? super T> comparator);
, чтобы избежать логического выраженияфлаг (например, boolean searchForMin
) и как я могу уменьшить общую сложность моей реализации?