mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2024-12-28 18:12:31 -06:00
241 lines
7 KiB
Java
241 lines
7 KiB
Java
package androidx.constraintlayout.motion.utils;
|
|
|
|
import java.lang.reflect.Array;
|
|
import tech.rabbit.r1launcher.BuildConfig;
|
|
|
|
/* loaded from: classes.dex */
|
|
public class HyperSpline {
|
|
double[][] mCtl;
|
|
Cubic[][] mCurve;
|
|
double[] mCurveLength;
|
|
int mDimensionality;
|
|
int mPoints;
|
|
double mTotalLength;
|
|
|
|
public HyperSpline(double[][] dArr) {
|
|
setup(dArr);
|
|
}
|
|
|
|
public HyperSpline() {
|
|
}
|
|
|
|
public void setup(double[][] dArr) {
|
|
int i;
|
|
int length = dArr[0].length;
|
|
this.mDimensionality = length;
|
|
int length2 = dArr.length;
|
|
this.mPoints = length2;
|
|
this.mCtl = (double[][]) Array.newInstance((Class<?>) Double.TYPE, length, length2);
|
|
this.mCurve = new Cubic[this.mDimensionality];
|
|
for (int i2 = 0; i2 < this.mDimensionality; i2++) {
|
|
for (int i3 = 0; i3 < this.mPoints; i3++) {
|
|
this.mCtl[i2][i3] = dArr[i3][i2];
|
|
}
|
|
}
|
|
int i4 = 0;
|
|
while (true) {
|
|
i = this.mDimensionality;
|
|
if (i4 >= i) {
|
|
break;
|
|
}
|
|
Cubic[][] cubicArr = this.mCurve;
|
|
double[] dArr2 = this.mCtl[i4];
|
|
cubicArr[i4] = calcNaturalCubic(dArr2.length, dArr2);
|
|
i4++;
|
|
}
|
|
this.mCurveLength = new double[this.mPoints - 1];
|
|
this.mTotalLength = BuildConfig.SENTRY_SAMPLE_RATE;
|
|
Cubic[] cubicArr2 = new Cubic[i];
|
|
for (int i5 = 0; i5 < this.mCurveLength.length; i5++) {
|
|
for (int i6 = 0; i6 < this.mDimensionality; i6++) {
|
|
cubicArr2[i6] = this.mCurve[i6][i5];
|
|
}
|
|
double d = this.mTotalLength;
|
|
double[] dArr3 = this.mCurveLength;
|
|
double approxLength = approxLength(cubicArr2);
|
|
dArr3[i5] = approxLength;
|
|
this.mTotalLength = d + approxLength;
|
|
}
|
|
}
|
|
|
|
public void getVelocity(double d, double[] dArr) {
|
|
double d2 = d * this.mTotalLength;
|
|
int i = 0;
|
|
while (true) {
|
|
double[] dArr2 = this.mCurveLength;
|
|
if (i >= dArr2.length - 1) {
|
|
break;
|
|
}
|
|
double d3 = dArr2[i];
|
|
if (d3 >= d2) {
|
|
break;
|
|
}
|
|
d2 -= d3;
|
|
i++;
|
|
}
|
|
for (int i2 = 0; i2 < dArr.length; i2++) {
|
|
dArr[i2] = this.mCurve[i2][i].vel(d2 / this.mCurveLength[i]);
|
|
}
|
|
}
|
|
|
|
public void getPos(double d, double[] dArr) {
|
|
double d2 = d * this.mTotalLength;
|
|
int i = 0;
|
|
while (true) {
|
|
double[] dArr2 = this.mCurveLength;
|
|
if (i >= dArr2.length - 1) {
|
|
break;
|
|
}
|
|
double d3 = dArr2[i];
|
|
if (d3 >= d2) {
|
|
break;
|
|
}
|
|
d2 -= d3;
|
|
i++;
|
|
}
|
|
for (int i2 = 0; i2 < dArr.length; i2++) {
|
|
dArr[i2] = this.mCurve[i2][i].eval(d2 / this.mCurveLength[i]);
|
|
}
|
|
}
|
|
|
|
public void getPos(double d, float[] fArr) {
|
|
double d2 = d * this.mTotalLength;
|
|
int i = 0;
|
|
while (true) {
|
|
double[] dArr = this.mCurveLength;
|
|
if (i >= dArr.length - 1) {
|
|
break;
|
|
}
|
|
double d3 = dArr[i];
|
|
if (d3 >= d2) {
|
|
break;
|
|
}
|
|
d2 -= d3;
|
|
i++;
|
|
}
|
|
for (int i2 = 0; i2 < fArr.length; i2++) {
|
|
fArr[i2] = (float) this.mCurve[i2][i].eval(d2 / this.mCurveLength[i]);
|
|
}
|
|
}
|
|
|
|
public double getPos(double d, int i) {
|
|
double[] dArr;
|
|
double d2 = d * this.mTotalLength;
|
|
int i2 = 0;
|
|
while (true) {
|
|
dArr = this.mCurveLength;
|
|
if (i2 >= dArr.length - 1) {
|
|
break;
|
|
}
|
|
double d3 = dArr[i2];
|
|
if (d3 >= d2) {
|
|
break;
|
|
}
|
|
d2 -= d3;
|
|
i2++;
|
|
}
|
|
return this.mCurve[i][i2].eval(d2 / dArr[i2]);
|
|
}
|
|
|
|
public double approxLength(Cubic[] cubicArr) {
|
|
int i;
|
|
int length = cubicArr.length;
|
|
double[] dArr = new double[cubicArr.length];
|
|
double d = BuildConfig.SENTRY_SAMPLE_RATE;
|
|
double d2 = 0.0d;
|
|
double d3 = 0.0d;
|
|
while (true) {
|
|
i = 0;
|
|
if (d2 >= 1.0d) {
|
|
break;
|
|
}
|
|
double d4 = 0.0d;
|
|
while (i < cubicArr.length) {
|
|
double d5 = dArr[i];
|
|
double eval = cubicArr[i].eval(d2);
|
|
dArr[i] = eval;
|
|
double d6 = d5 - eval;
|
|
d4 += d6 * d6;
|
|
i++;
|
|
}
|
|
if (d2 > BuildConfig.SENTRY_SAMPLE_RATE) {
|
|
d3 += Math.sqrt(d4);
|
|
}
|
|
d2 += 0.1d;
|
|
}
|
|
while (i < cubicArr.length) {
|
|
double d7 = dArr[i];
|
|
double eval2 = cubicArr[i].eval(1.0d);
|
|
dArr[i] = eval2;
|
|
double d8 = d7 - eval2;
|
|
d += d8 * d8;
|
|
i++;
|
|
}
|
|
return d3 + Math.sqrt(d);
|
|
}
|
|
|
|
static Cubic[] calcNaturalCubic(int i, double[] dArr) {
|
|
double[] dArr2 = new double[i];
|
|
double[] dArr3 = new double[i];
|
|
double[] dArr4 = new double[i];
|
|
int i2 = i - 1;
|
|
int i3 = 0;
|
|
dArr2[0] = 0.5d;
|
|
int i4 = 1;
|
|
for (int i5 = 1; i5 < i2; i5++) {
|
|
dArr2[i5] = 1.0d / (4.0d - dArr2[i5 - 1]);
|
|
}
|
|
int i6 = i - 2;
|
|
dArr2[i2] = 1.0d / (2.0d - dArr2[i6]);
|
|
dArr3[0] = (dArr[1] - dArr[0]) * 3.0d * dArr2[0];
|
|
while (i4 < i2) {
|
|
int i7 = i4 + 1;
|
|
int i8 = i4 - 1;
|
|
dArr3[i4] = (((dArr[i7] - dArr[i8]) * 3.0d) - dArr3[i8]) * dArr2[i4];
|
|
i4 = i7;
|
|
}
|
|
double d = (((dArr[i2] - dArr[i6]) * 3.0d) - dArr3[i6]) * dArr2[i2];
|
|
dArr3[i2] = d;
|
|
dArr4[i2] = d;
|
|
while (i6 >= 0) {
|
|
dArr4[i6] = dArr3[i6] - (dArr2[i6] * dArr4[i6 + 1]);
|
|
i6--;
|
|
}
|
|
Cubic[] cubicArr = new Cubic[i2];
|
|
while (i3 < i2) {
|
|
double d2 = dArr[i3];
|
|
double d3 = dArr4[i3];
|
|
int i9 = i3 + 1;
|
|
double d4 = dArr[i9];
|
|
double d5 = dArr4[i9];
|
|
cubicArr[i3] = new Cubic((float) d2, d3, (((d4 - d2) * 3.0d) - (d3 * 2.0d)) - d5, ((d2 - d4) * 2.0d) + d3 + d5);
|
|
i3 = i9;
|
|
}
|
|
return cubicArr;
|
|
}
|
|
|
|
/* loaded from: classes.dex */
|
|
public static class Cubic {
|
|
public static final double HALF = 0.5d;
|
|
public static final double THIRD = 0.3333333333333333d;
|
|
double mA;
|
|
double mB;
|
|
double mC;
|
|
double mD;
|
|
|
|
public double eval(double d) {
|
|
return (((((this.mD * d) + this.mC) * d) + this.mB) * d) + this.mA;
|
|
}
|
|
|
|
public double vel(double d) {
|
|
return (((this.mD * 0.3333333333333333d * d) + (this.mC * 0.5d)) * d) + this.mB;
|
|
}
|
|
|
|
public Cubic(double d, double d2, double d3, double d4) {
|
|
this.mA = d;
|
|
this.mB = d2;
|
|
this.mC = d3;
|
|
this.mD = d4;
|
|
}
|
|
}
|
|
}
|