Rabbit-R1/android (non root)/java/sources/androidx/constraintlayout/motion/utils/HyperSpline.java
2024-05-21 17:08:36 -04:00

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;
}
}
}