Для любого, кто случайно найдет мой вопрос, я решил свою проблему. Чтобы найти общее расстояние вашей кривой, разбейте ее на 1000 или около того кусков (все еще довольно точных), найдите расстояние между каждой точкой, затем сложите их все вместе. (вы должны использовать параметрическую формулу)
Теперь найдите процент пути вдоль вашей кривой. = расстояние / всегоДлингаКрива
Используйте этот процент в качестве нового значения t для x и y, и теперь у вас есть новые позиции x и y.
ВАЖНО: Это странный случай, но вы должны использовать абсолютное значение, если ваше значение t когда-либо будет больше 1. Когда вы его кубизируете, это значение будет отрицательным ... = происходят плохие вещи.
Гадкий, но соответствующий код показан ниже.
Разбиение кривой на 1000 частей
for (double t = 0.00; t < 1.001; t= t + .001) {
double xValue = Math.pow((1-t), 3) * point1x + 3 * Math.pow((1-t), 2) * t * point2x + 3 * (1-t) * Math.pow(t, 2) * point3x + Math.pow(t, 3) * point4x;
double yValue = Math.pow((1-t), 3) * point1y + 3 * Math.pow((1-t), 2) * t * point2y + 3 * (1-t) * Math.pow(t, 2) * point3y + Math.pow(t, 3) * point4y;
** Теперь, когда вы вычисляете расстояние между каждой точкой. Я бы посоветовал поместить вышеуказанные значения в массив и выполнить цикл.
Расчет позиций х и у
xPos = Math.abs(Math.pow((1 - percenttraveled), 3)) * point1x + 3 * Math.pow((1 - percenttraveled), 2) * percenttraveled * point2x + 3 * Math.abs((1 - percenttraveled)) * Math.pow(percenttraveled, 2) * point3x + Math.abs(Math.pow(percenttraveled, 3)) * point4x;
yPos = Math.abs(Math.pow((1 - percenttraveled), 3)) * point1y + 3 * Math.pow((1 - percenttraveled), 2) * percenttraveled * point2y + 3 * Math.abs((1 - percenttraveled)) * Math.pow(percenttraveled, 2) * point3y + Math.abs(Math.pow(percenttraveled, 3)) * point4y;