ma2tetr/src/main/java/ma2tetr/impl/TetrahedronMovingCalculator.java

82 lines
2.4 KiB
Java
Raw Normal View History

2023-05-18 16:14:03 +02:00
package ma2tetr.impl;
2023-05-18 21:50:31 +02:00
import java.util.ArrayList;
2023-05-18 16:14:03 +02:00
import java.util.HashSet;
2023-05-18 21:50:31 +02:00
import java.util.List;
2023-05-18 16:14:03 +02:00
import java.util.Set;
import ma2tetr.api.ITetrahedronCoordCalculator;
2023-06-06 19:29:21 +02:00
import ma2tetr.condition.RadiusCondition;
import ma2tetr.condition.TetrahedronCondition;
2023-05-18 16:14:03 +02:00
import ma2tetr.model.Coords3D;
2023-05-18 21:50:31 +02:00
import ma2tetr.model.IterationState;
2023-05-18 16:14:03 +02:00
import ma2tetr.model.Point3D;
import ma2tetr.model.Tetrahedron;
import ma2tetr.model.Vector3D;
public class TetrahedronMovingCalculator implements ITetrahedronCoordCalculator {
private double radius = 1.0;
private Tetrahedron tetrahedron = null;
2023-05-18 21:50:31 +02:00
private List<IterationState> log = new ArrayList<>();
2023-05-21 13:14:20 +02:00
private double accuracy = 0.00000000001;
2023-05-18 16:14:03 +02:00
@Override
public void setRadius(double radius) {
this.radius = radius;
}
@Override
public void calculate() {
Coords3D center = new Vector3D(0, 0, 0);
Point3D top = new Point3D(0, radius, 0);
TriangleBaseMover triangle = new TriangleBaseMover(radius);
triangle.move(-radius);
Set<Coords3D> points = new HashSet<>();
points.add(top);
points.add(triangle.getP1());
points.add(triangle.getP2());
points.add(triangle.getP3());
2023-05-18 21:50:31 +02:00
StateLogger logger = new StateLogger(center, points, log);
2023-06-06 19:29:21 +02:00
RadiusCondition rinv = new RadiusCondition(points, center, radius);
2023-05-21 13:14:20 +02:00
rinv.setAccuracy(accuracy);
2023-06-06 19:29:21 +02:00
TetrahedronCondition tinv = new TetrahedronCondition(top, triangle.getP1(), triangle.getP2(), triangle.getP3());
2023-05-21 13:14:20 +02:00
tinv.setAccuracy(accuracy);
2023-05-18 16:14:03 +02:00
double scaling = radius / 10;
while(true) {
triangle.move(scaling);
if (!rinv.isFulfilled()) {
throw new RuntimeException("Unexpected error");
2023-05-21 13:14:20 +02:00
} else if (tinv.isFulfilled() || scaling <= accuracy) {
2023-05-18 16:14:03 +02:00
break;
} else if (tinv.firstDifference() < 0) {
triangle.move(-scaling);
scaling = scaling / 10;
}
2023-05-18 21:50:31 +02:00
logger.logState();
2023-05-18 16:14:03 +02:00
}
tetrahedron = new Tetrahedron(top, triangle.getP1(), triangle.getP2(), triangle.getP3());
}
@Override
public Tetrahedron getTetrahedron() {
return this.tetrahedron;
}
@Override
public double getRadius() {
return this.radius;
}
2023-05-18 21:50:31 +02:00
@Override
public List<IterationState> getStateLog() {
return log;
}
2023-05-21 13:14:20 +02:00
@Override
public void setAccuracy(double accuracy) {
this.accuracy = accuracy;
}
2023-05-18 16:14:03 +02:00
}