Рисование касательных для кривой Безье в OpenGL с использованием переполнения стека

Итак, у меня есть программа, которая имеет 4 контрольные точки

std::vector<ControlPoint> cam_pos_points;
cam_pos_points.push_back(ControlPoint(-0.79, 0.09, 0.2, 0));
cam_pos_points.push_back(ControlPoint(-0.88, -0.71, 0.2, 1));
cam_pos_points.push_back(ControlPoint(1.3, -0.8, 0.2, 2));
cam_pos_points.push_back(ControlPoint(0.71, 0.76, 0.2, 3));

По сути, получается, что я настроил способ перемещения контрольных точек, и когда контрольная точка перемещается, новая позиция сохраняется, и кривая пересчитывается на основе этой новой позиции. То, как я рисую кривую, я использую эти уравнения:

for (double t = 0; t < 1; t += 0.1){
float Px =(pow((1 - t), 3) * cam_pos_points[0].positionx()) +
((pow((1 - t), 2) * t) * cam_pos_points[1].positionx()) +
(((1 - t) * pow(t, 2)) * cam_pos_points[2].positionx()) +
(pow(t, 3) * cam_pos_points[3].positionx());

float Py =(pow((1 - t), 3) * cam_pos_points[0].positiony()) +
((pow((1 - t), 2) * t) * cam_pos_points[1].positiony()) +
(((1 - t) * pow(t, 2)) * cam_pos_points[2].positiony()) +
(pow(t, 3) * cam_pos_points[3].positiony());
}

И затем, используя эти два значения с плавающей точкой, я помещаю их в vec3 и делаю кучу замечаний. Затем я рисую линию между всеми этими точками, помещая их в многострочный класс, определяя, какие точки будут на кривой, а затем рисуя прямую линию между каждой точкой. Конечным результатом будет кривая Безье.

У меня сейчас проблема в том, чтобы нарисовать касательные для кривой Безье. Моя идея заключалась в том, что для первой контрольной точки было сказать, что касательная находится на линии P1 — P2. Итак, после рисования касательной, когда я перемещаю точку касания, какие уравнения я должен использовать, чтобы заново нарисовать форму кривой? Я уже нашел производные уравнения кривой Безье, но я не знаю, что с ними делать:

float dx = (-3*(pow((1 - t), 2)) * cam_pos_points[0].positionx()) +
(((-2*(1 - t)) * t) * cam_pos_points[1].positionx()) +
(((1 - t) * (2*t)) * cam_pos_points[2].positionx()) +
((3*pow(t, 2)) * cam_pos_points[3].positionx());

float dy = (-3*(pow((1 - t), 2)) * cam_pos_points[0].positiony()) +
(((-2*(1 - t)) * t) * cam_pos_points[1].positiony()) +
(((1 - t) * (2*t)) * cam_pos_points[2].positiony()) +
((3*pow(t, 2)) * cam_pos_points[3].positiony());

0

Решение

Начальная касательная будет от первой контрольной точки ко второй, а конечная касательная будет от четвертой контрольной точки к третьей. Я бы посоветовал вам начинать все заново каждый раз, когда вы перерисовываете его; то есть всякий раз, когда контрольная точка перемещается, обрабатывайте ее как совершенно новое уравнение.

В случае, если один (или оба) ваших касательных имеют нулевую длину, то они на самом деле не являются касательными как таковой но кривая пойдет к противоположной конечной точке.

Вот почему вы можете использовать сечение Безье без касательных для представления прямой линии.

0

Другие решения

Уравнения неверны.

Правильное уравнение

(1-t)^3 * p0 + 3*(1-t)^2*t * p1 + 3*(1-t)*t^2 * p2 + t^3 * p3.

расширить и дифференцировать, чтобы получить касательные.

0

Похоже, что вы хотите нарисовать точки касания для вектора касания в начале и в конце кривой Безье, чтобы вы могли позволить пользователям регулировать форму кривой, перемещая точки касания. Если это так, вы должны знать, что перемещение точек касания также переместит 2-ю или 3-ю контрольные точки. Таким образом, правильной процедурой будет пересчет 2-й или 3-й контрольной точки по перемещенным касательным точкам, а затем перерисовка кривой.

Для кубической кривой Безье C ‘(t) при t = 0 и 1

С ‘(0) = 3 * (Р1-Р0)
С ‘(1) = 3 * (Р3-Р2)

Давайте предположим, что ваша точка касания для начальной касательной равна T0 и находится в

T0 = ​​P0 + s0 * C ‘(0) = P0 + 3 * s0 * (P1-P0)

где s0 — постоянный масштабный коэффициент, обеспечивающий, чтобы ваша точка касания не находилась слишком далеко от контрольных точек. Когда T0 изменяется на T0 *, вы можете обновить контрольную точку P1 как

P1 * = (T0 * -P0) / (3 * s0) + P0.

Выполните аналогичное обновление для контрольной точки P2, когда точка касания конечной касательной перемещается. Затем вы можете перерисовать свою кривую.

0
По вопросам рекламы [email protected]