PowerMiner/src/PathTransformer.java

54 lines
2.2 KiB
Java

import java.awt.Point;
import java.awt.geom.Point2D;
import Jama.Matrix;
public class PathTransformer {
private static Point2D generatePeakForTransformationParabola(int pathDistance) {
double maxTransformationScale = 0.20;
double peakX = Randomizer.nextGaussianDoubleWithinRange(pathDistance / 3, 2 * pathDistance / 3);
double peakY = Randomizer.nextGaussianDoubleWithinRange(1 - maxTransformationScale, 1 + maxTransformationScale);
return new Point2D.Double(peakX, peakY);
}
public static double[] generateParabolaEquation(int pathDistance) {
Point2D p1 = new Point2D.Double(0, 1);
Point2D p2 = generatePeakForTransformationParabola(pathDistance);
Point2D p3 = new Point2D.Double(pathDistance, 1);
return generateEquationForTransformationParabola(p1, p2, p3);
}
private static double[] generateEquationForTransformationParabola(Point2D p1, Point2D p2, Point2D p3) {
if (p1.getX() == p2.getX() || p1.getX() == p3.getX() || p2.getX() == p3.getX()) {
double[] equation = {0.0, 0.0, 1.0};
return equation;
}
double[][] lhsArray = {{0, 0, 1}, {p2.getX() * p2.getX(), p2.getX(), 1}, {p3.getX() * p3.getX(), p3.getX(), 1}};
double[] rhsArray = {p1.getY(), p2.getY(), p3.getY()};
Matrix lhs = new Matrix(lhsArray);
Matrix rhs = new Matrix(rhsArray, 3);
//System.out.println("(" + p1.getX() + "," + p1.getY() + "), (" + p2.getX() + "," + p2.getY() + "), (" + p3.getX() + "," + p3.getY() + ")");
Matrix ans = lhs.solve(rhs);
/*System.out.println("x = " + ans.get(0, 0));
System.out.println("y = " + ans.get(1, 0));
System.out.println("z = " + ans.get(2, 0));*/
double[] equation = {ans.get(0, 0), ans.get(1, 0), ans.get(2, 0)};
return equation;
}
public static double getParabolaHeightAtPoint(double[] parabolaEquation, double x) {
return (parabolaEquation[0] * x * x + parabolaEquation[1] * x + parabolaEquation[2]);
}
public static void main(String[] args) {
Point2D p1 = new Point2D.Double(0, 1);
Point2D p3 = new Point2D.Double(200, 1);
Point2D p2 = generatePeakForTransformationParabola(200);
generateEquationForTransformationParabola(p1, p2, p3);
}
}