package com.artemis.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringWriter; import java.io.Writer; public class Utils { public static float cubicInterpolation(float v0, float v1, float v2, float v3, float t) { float t2 = t * t; float a0 = v3 - v2 - v0 + v1; float a1 = v0 - v1 - a0; float a2 = v2 - v0; float a3 = v1; return (a0 * (t * t2)) + (a1 * t2) + (a2 * t) + a3; } public static float quadraticBezierInterpolation(float a, float b, float c, float t) { return (((1f - t) * (1f - t)) * a) + (((2f * t) * (1f - t)) * b) + ((t * t) * c); } public static float lengthOfQuadraticBezierCurve(float x0, float y0, float x1, float y1, float x2, float y2) { if ((x0 == x1 && y0 == y1) || (x1 == x2 && y1 == y2)) { return distance(x0, y0, x2, y2); } float ax, ay, bx, by; ax = x0 - 2 * x1 + x2; ay = y0 - 2 * y1 + y2; bx = 2 * x1 - 2 * x0; by = 2 * y1 - 2 * y0; float A = 4 * (ax * ax + ay * ay); float B = 4 * (ax * bx + ay * by); float C = bx * bx + by * by; float Sabc = 2f * (float) Math.sqrt(A + B + C); float A_2 = (float) Math.sqrt(A); float A_32 = 2f * A * A_2; float C_2 = 2f * (float) Math.sqrt(C); float BA = B / A_2; return (A_32 * Sabc + A_2 * B * (Sabc - C_2) + (4f * C * A - B * B) * (float) Math.log((2 * A_2 + BA + Sabc) / (BA + C_2))) / (4 * A_32); } public static float lerp(float a, float b, float t) { if (t < 0) return a; return a + t * (b - a); } public static float distance(float x1, float y1, float x2, float y2) { return euclideanDistance(x1, y1, x2, y2); } public static boolean doCirclesCollide(float x1, float y1, float radius1, float x2, float y2, float radius2) { float dx = x2 - x1; float dy = y2 - y1; float d = radius1 + radius2; return (dx * dx + dy * dy) < (d * d); } public static float euclideanDistanceSq2D(float x1, float y1, float x2, float y2) { float dx = x1 - x2; float dy = y1 - y2; return dx * dx + dy * dy; } public static float manhattanDistance(float x1, float y1, float x2, float y2) { return Math.abs(x1 - x2) + Math.abs(y1 - y2); } public static float euclideanDistance(float x1, float y1, float x2, float y2) { float a = x1 - x2; float b = y1 - y2; return (float) FastMath.sqrt(a * a + b * b); } public static float angleInDegrees(float ownerRotation, float x1, float y1, float x2, float y2) { return Math.abs(ownerRotation - angleInDegrees(x1, y1, x2, y2)) % 360; } public static float angleInDegrees(float originX, float originY, float targetX, float targetY) { return (float) Math.toDegrees(Math.atan2(targetY - originY, targetX - originX)); } public static float angleInRadians(float originX, float originY, float targetX, float targetY) { return (float) Math.atan2(targetY - originY, targetX - originX); } public static boolean shouldRotateCounterClockwise(float angleFrom, float angleTo) { float diff = (angleFrom - angleTo) % 360; return diff > 0 ? diff < 180 : diff < -180; } public static float getRotatedX(float currentX, float currentY, float pivotX, float pivotY, float angleDegrees) { float x = currentX - pivotX; float y = currentY - pivotY; float xr = (x * TrigLUT.cosDeg(angleDegrees)) - (y * TrigLUT.sinDeg(angleDegrees)); return xr + pivotX; } public static float getRotatedY(float currentX, float currentY, float pivotX, float pivotY, float angleDegrees) { float x = currentX - pivotX; float y = currentY - pivotY; float yr = (x * TrigLUT.sinDeg(angleDegrees)) + (y * TrigLUT.cosDeg(angleDegrees)); return yr + pivotY; } public static float getXAtEndOfRotatedLineByOrigin(float x, float lineLength, float angleDegrees) { return x + TrigLUT.cosDeg(angleDegrees) * lineLength; } public static float getYAtEndOfRotatedLineByOrigin(float y, float lineLength, float angleDegrees) { return y + TrigLUT.sinDeg(angleDegrees) * lineLength; } public static boolean collides(float x1, float y1, float radius1, float x2, float y2, float radius2) { float d = Utils.distance(x1, y1, x2, y2); d -= radius1 + radius2; return d < 0; } public static String readFileContents(String file) { InputStream is = Utils.class.getClassLoader().getResourceAsStream(file); String contents = ""; try { if (is != null) { Writer writer = new StringWriter(); char[] buffer = new char[1024]; Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); int n; while ((n = reader.read(buffer)) != -1) { writer.write(buffer, 0, n); } contents = writer.toString(); } } catch (Exception e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return contents; } }