Расчет тангенса для кубической кривой Безье Ява - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь вычислить касательную кубической кривой Безье, определенной точками p0, p1, p2, p3 и t.

Я знаю, что это должен быть простой расчет, а касательная должна быть просто производной уравнения кубической кривой Безье.Я пытаюсь сделать это таким же образом, как я вычисляю свои точки кривой: то есть, отдельно передавая значения x каждого p0-p3 в кубическое уравнение Безье, а затем делая то же самое с точкой y, а затем используя результаты длякоординаты x, y следующей точки на кривой (следующей будет точка в точке t)

Проблема в том, что, хотя приведенное выше уравнение работает, и я получаю точную кривую Безье, когда пытаюсь выполнитьто же самое для касательных векторов в точке t, они все массивно отключены (особенно слишком высоко (значение -y) и слева).

My graph

Другая проблема, которая меня беспокоит, заключается в том, что я знаю, что касательный вектор к кривой при t = 0.0 должен быть от p0 до p1, однако при примененииэто к производной, это заканчивается (упрощенно): -3 * p0 + 3 * p1 Что никогда не будет p1, если бы p1 и p0 не были одинаковыми?

Я чувствую, что мне здесь не хватает дополнительного шага.

Я также посмотрел на Найдите касательную точки на кубической кривой Безье , которая нея не работаю

Я должен также упомянуть, что я делаю все это на холсте java graphics2d, поэтому начало координат находится в верхнем левом углу, а положительная ось y - "вниз", а отрицательная ось y - "вверх" и ось x.это нормально - я не уверен, есть ли проблема с этим.

Код для расчета кривой Безье (только x или y)

private static double getPoint(double a0, double a1, double a2, double a3, double detail) {
    return Math.pow(1 - detail, 3) * a0 
     + 3 * Math.pow(1 - detail, 2) * detail * a1
     + 3 * (1 - detail) * Math.pow(detail, 2) * a2
     + Math.pow(detail, 3) * a3;
}

Код для вычисления касательной приведен ниже.

double tan = -3 * p0 * (Math.pow(1-t,2)) +
              p1 * (3*(Math.pow(1-t,2)) - 6*(1-t)*t) +
              p2*(6 * (1-t) * t) - (3 * Math.pow(t,2)) +
              3 * p3 * Math.pow(t, 2);`

Здесь я бы передал в х-значения для p0 - p3, а затем значения y для p0-p3 и получить координаты (конца?) касательной от обоих из них.

Есть ли что-нибудь вопиюще очевидное, что я пропускаю?

1 Ответ

0 голосов
/ 14 марта 2019

Как вы визуализируете касательные? они должны отображаться как строка, начинающаяся с position(t) и заканчивающаяся на position(t)+size*tangent(t), где size - это постоянное масштабирование касательной к видимой / полезной длине ...

моя ставка в том, что вы забыли position(t)+ в последней конечной точке (распространенная ошибка новичка, даже я делал это несколько раз раньше). Если ничего не работает, вы также можете использовать postion(t+dt)-position(t) в качестве тангенса.

...