Как рассчитать ненулевые dx/dt и dy/dt при t = 0, когда P0 == P1 на кубической кривой Безье?

Прежде чем приступить к решению задачи, я использую P0, P1, P2 и P3 для четырех кубических точек Безье и t, поскольку она параметрическая. Кроме того, я искал аналогичную проблему на этом сайте, а также в Google, и не смог ее найти. Прошу прощения, если это общий вопрос.

Проблема: я получаю наклон 0 как для dx/dt, так и для dy/dt для кубического Безье в этих двух случаях.

1: t = 0 and P0 == P1
2: t = 1 and P2 == P3

Вот пример, иллюстрирующий (1), где t = 0 и P0 == P1.

Найдите тангенс (то есть dx/dt и dy/dt) следующего куба Безье в момент t = 0:

(100, 100) (100, 100) (150, 150) (200, 100)

Чтобы найти тангенс, нам нужна первая производная кубического Безье:

Cubic Bezier definition
B(t) = (1-t)^3P0 + 3t(1-t)^2P1 + 3t^2(1-t)P2 + t^3P3    
First derivative of a bezier curve (if you'd like to see the steps I used to get here, let me know)
B'(t) = (-3P0 + 9P1 - 9P2 + 3P3)t^2 + (6P0 - 12P1 + 6P2)t + (-3P0 + 3P1)

Подставив t = 0 в уравнение первой производной, мы получим

B'(0) = -3P0 + 3P1

И, наконец, напомним, что P0 = P1 = (100, 100), поэтому dx/dt и dy/dt равны:

dx/dt = dy/dt = -3*(100) + 3*(100) = 0

Это говорит мне... нет касательной при t = 0 для этого куба Безье. Что не имеет смысла, если бы вы построили график и посмотрели на него.

Чтобы получить ненулевой наклон, я делаю следующее: рассматриваю точки P1, P2 и P3 как квадратичный критерий Безье, преобразую их в эквивалентный кубический критерий Безье, ЗАТЕМ нахожу первую производную при t = 0. Есть ли какая-либо как я могу избежать этого? Мне трудно принять тангенс, который имеет 0 для dx/dt и dy/dt. Спасибо за вашу помощь.


person Ootawata    schedule 08.05.2012    source источник


Ответы (2)


Производная B'(t) в t = 0 действительно не определена для случая 1 (и в t = 1 для случая 2).

Чтобы понять, почему это так, мы можем запустить алгоритм де Кастельжо «в обратном направлении» на вашем примере, чтобы удвоить диапазон параметров кривой от t = 0 ... 1 до t = -1 ... 1. В результате получаются следующие контрольные точки кубической кривой Безье:

(300,400) (0,-100) (100,200) (200,100)

Если вы построите эту кривую, вы увидите исходную кривую из t = 0.5 ... 1. Вы также увидите, что на этой расширенной кривой есть пик в точке t = 0.5, прямо в начале вашего оригинала. Из-за этого стыка ваша кривая не дифференцируема в начальной точке.

Однако касательная кривой не совсем не то же самое, что и производная. Так что, если все, что вам нужно, это касательная, вам повезло. (Производная касается кривой, как и любой другой вектор, перпендикулярный нормали кривой.)

Оказывается, касательные на концах кривой в общем случае эквивалентны:

P1 - P0 at t = 0
P3 - P2 at t = 1

Однако, если (и только если) P0 = P1 и/или P2 = P3, то касательная в вырожденной точке (то есть в t = 0, если P0 = P1 и/или t = 1, если P2 = P3) эквивалентна:

P2 - P1

Вы можете убедиться, что это так, оценив B'(t) как t->0.

На самом деле, если вы разделите расширенную кривую на две части в точке t = 0.5, а затем примените уравнение P2 - P1 к каждой стороне, вы увидите две разные касательные в вершине. Касательные для каждой половины кривой указывают в прямо противоположных направлениях. Это еще одна иллюстрация того, почему в данный момент производная не определена.

И последнее замечание: ваш прием обращения с точками P1, P2 и P3 как с квадратичной кривой Безье также даст вам правильную касательную. Однако это не даст вам правильную производную.

person Naaff    schedule 09.05.2012
comment
Вау, классный ответ. После публикации этого вопроса я еще немного подумал об этом и понял часть вашего ответа. Например, вы все еще можете получить наклон между точками P2 и P1, а также то, что когда P0 == P1, имеет смысл, что производная не определена (наклон между P0 и P1 не определен). Большое спасибо за разъяснение почему?! - person Ootawata; 09.05.2012

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

Вы хотите найти концы кубического безье. Поскольку кривая (т. е. ее значения x и y) является параметрической по t, вы будете дифференцировать x и y относительно. т отдельно. Пара, к которой вы пришли, может быть представлена ​​как мгновенная «скорость» точки, движущейся по кривой. Таким образом, начальная скорость точки в этом случае равна нулю (или, точнее, нуль-вектору), но (скорее всего) ускорение (или, в противном случае, по крайней мере, скорость изменения ускорения) будет ненулевым, и, следовательно, скорость точки станет отличной от нуля (ненулевой вектор), и, следовательно, она будет двигаться от этих координат и следовать по кривой.

Но наклон, как вы его визуально воспринимаете, не является параметрическим, т.е. не зависит от времени. И.О.В. то, что вы ищете, это dy/dx, а не пара (dx/dt, dy/dt), и учитывая, что dx/dt и dy/dt оба равны нулю при t=0 для вашей кривой, dy/dx = ( dy/dt)/(dx/dt) = 0/0, что является неопределенным. Чтобы оценить это, нужно применить правило Лопиталя. Подробное описание правила можно найти в статье Википедии. но в основном это означает, что для оценки таких неопределенных пределов мы можем отдельно дифференцировать числитель f и знаменатель g, чтобы получить f' и g', и тогда предел (f/g) равен пределу (f'/g'). Теперь, если точки p0, p1, p2 и p3 определяют куб, тогда:

dy/dt = ypart (3 * (p1 - p0) + 6 * t * (p2 - 2 * p1 + p0) + 3 * t ** 2 * (p3 - 3 * p2 + 3 * p1 - p0))

dx/dt = xpart (3 * (p1 - p0) + 6 * t * (p2 - 2 * p1 + p0) + 3 * t ** 2 * (p3 - 3 * p2 + 3 * p1 - p0))

-> (dy/dt) / (dx/dt) = ypart (p1 - p0) / xpart (p1 - p0)

Но это становится неопределенным, когда p0 == p1. Теперь по правилу Лопиталя

предел (t-> 0) [ (dy/dt) / (dx/dt)] = предел (t-> 0) [ (d2y/dt2) / (d2x/dt2)]

Сейчас:

d2y/dt2 = ypart (6 * (p2 - 2 * p1 + p0) + 6 * t * (p3 - 3 * p2 + 3 * p1 - p0))

d2x/dt2 = xpart (6 * (p2 - 2 * p1 + p0) + 6 * t * (p3 - 3 * p2 + 3 * p1 - p0))

и при t = 0 (d2y/dt2) / (d2x/dt2) = ypart (p2 - 2 * p1 + p0) / xpart (p2 - 2 * p1 + p0)

Но поскольку p1 == p0, это становится: ypart (p2 - p0) / xpart (p2 - p0), что является именно тем результатом, который сказал вам Наафф. Заметим, что если даже p2 == p0 (действительно вырожденная кривая, особенно кубическая, в таком случае это будет просто прямая линия!), то даже это будет неопределенно, и можно еще раз дифференцировать числитель и знаменатель, чтобы получить:

предел(dy/dx) = предел(t->0) [(d3y/dt3) / (d3x/dt3)] = ypart (p3 - p0) / xpart (p3 - p0)

Я надеюсь, что это было полезно для вас... (Кстати, похоже, что TeX-подобная нотация здесь не работает, в отличие от math.stackexchange, иначе я бы предоставил математическую разметку.)

person jamadagni    schedule 07.01.2013