Вычислить кубическое значение T Безье, где касательная перпендикулярна линии привязки

Спроецируйте кубическую форму Безье p1, p2, p3, p4 на прямую p1, p4. Когда точка p2 или p3 не проецируется на отрезок линии между p1 и p4, кривая будет выступать из узловых точек. Есть ли способ вычислить значение T, когда касательная к кривой перпендикулярна линии привязки?

Это также можно было бы сформулировать как нахождение значений T там, где спроецированная кривая наиболее удалена от центра линейного сегмента p1, p4. Когда p2 и p3 проецируются на отрезок прямой, решения равны 0 и 1 соответственно. Есть ли уравнение для решения более интересного случая?

Значение T, похоже, зависит только от расстояния сопоставленных контрольных точек от сегмента линии привязки.

Я могу определить ценность, уточняя предположения, но надеюсь, что есть способ получше.

Редактировать:

Начиная с p1, .., p4 в 2d со значениями x1, y1, ..., x4, y4, я использую следующий код, основанный на ответе Филиппа:

dx = x4 - x1;
dy = y4 - y1;
d2 = dx*dx + dy*dy;
p1 = ( (x2-x1)*dx + (y2-y1)*dy ) / d2;
p2 = ( (x3-x1)*dx + (y3-y1)*dy ) / d2;
tr = sqrt( p1*p1 - p1*p2 - p1 + p2*p2 );
t1 = ( 2*p1 - p2 - tr ) / ( 3*p1 - 3*p2 + 1 );
t2 = ( 2*p1 - p2 + tr ) / ( 3*p1 - 3*p2 + 1 );

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


person drawnonward    schedule 20.04.2010    source источник
comment
Вы также можете попробовать mathoverflow.net   -  person Darin Dimitrov    schedule 20.04.2010


Ответы (1)


Предположим, у вас есть одномерная кубическая кривая Безье с P0 = 0 и P3 = 1, тогда кривая будет:

P(t) = b0,3(t)*0 + b1,3(t)*P1 + b2,3(t)*P2 + b3,3(t)*1

Где bi,3(t) - это многочлены Бернштейна степени 3. Затем мы ищем значение t где это P(t) является минимальным и максимальным, поэтому мы получаем:

P'(t) = b1,3'(t)*P1 + b2,3'(t)*P2 + b3,3'(t)
      = (3 - 12t + 9t^2)*P1 + (6t - 9t^2)*P2 + 3t^2
      = 0

У этого есть замкнутое, но нетривиальное решение. Согласно WolframAlpha, когда 3P1 - 3P2 +1 != 0 это:

t = [2*P1 - P2 +/- sqrt(P1^2-P1*P2-P1+P2^2)] / (3*P1 - 3*P2 + 1)

В противном случае это:

t = 3P1 / (6P1 - 2)

Для общей n-мерной кубики Безье P0 *, P1 *, P2 *, P3 * вычислить:

P1 = proj(P1*, P03*) / |P3* - P0*|
P2 = proj(P2*, P03*) / |P3* - P0*|

Где proj(P, P03*) - это расстояние со знаком от P0* до точки P, спроецированной на линию, проходящую через P0* и P3*.

(Я не проверял это, поэтому, пожалуйста, подтвердите, что в моих рассуждениях нет ничего неправильного.)

person Philippe Beaudoin    schedule 20.04.2010
comment
sqrt (... P2 * 2) должен быть P2 ^ 2 - person drawnonward; 20.04.2010
comment
Спасибо, все работает как положено. При получении двух допустимых значений из +/- результат + должен быть вычтен из 1,0 в моих испытаниях. Иногда бывает и наоборот. - person drawnonward; 20.04.2010
comment
Это могло произойти из-за того, как вы вычисляете proj(). Это должно быть расстояние со знаком от P0*, то есть, если оно проецируется в сторону P0* от P3*, оно должно быть отрицательным. - person Philippe Beaudoin; 20.04.2010