Как преобразовать кривую Эрмита в кривую Безье? - PullRequest
6 голосов
/ 24 октября 2011

Как говорится в теме: Как преобразовать кривую Эрмита в кривую Безье? В частности, я ищу способ преобразования класса Curve, использующего интерполяцию Эрмита, в Microsoft XNA Framework для рисования с помощью StreamGeometry или PathGeometry из Windows Presentation Foundation.

Я сталкивался с похожим вопросом ([Рисование кривых Эрмита в OpenGL), где ответ следующий.

[b0] = 1 [ 3  0  0  0] [h0]
[b1]   - [ 3  0  1  0] [h1]
[b2]   3 [ 0  3  0 -1] [v0]
[b3]     [ 0  3  0  0] [v1]

Что упрощает до:

b0 = h0
b1 = h0 + v0/3
b2 = h1 - v1/3
b3 = h1

Даже с этой информацией я по сути застрял на вычислении контрольных точек. Проблема в том, что класс Curve представляет TangentIn и TangentOut в качестве скаляра. Учитывая, что рисование многочлена происходит в 2-мерном пространстве (время, значение), этот скаляр необходимо преобразовать в 2-мерный вектор, чтобы применить его к этой формуле. Однако я не уверен, какие шаги предпринимаются в этом процессе преобразования, но я подозреваю, что мне нужно применить уравнение дифференцирования Эрмита.

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

private static float Hermite(CurveKey k0, CurveKey k1, float t)
{
     if (k0.Continuity == CurveContinuity.Step)
     { 
         if (t >= 1f)
         {
             return k1.internalValue;
         }
         return k0.internalValue;
     }

     float num = t * t;
     float num2 = num * t;
     float internalValue = k0.internalValue;
     float num5 = k1.internalValue;
     float tangentOut = k0.tangentOut;
     float tangentIn = k1.tangentIn;
     return ((((internalValue * (((2f * num2) - (3f * num)) + 1f)) + (num5 * ((-2f * num2) + (3f * num)))) + (tangentOut * ((num2 - (2f * num)) + t))) + (tangentIn * (num2 -  num)));
}

Любая информация очень ценится.

1 Ответ

3 голосов
/ 25 октября 2011

Я никогда не использовал XNA, но, взглянув на документацию, кажется, что класс Curve соответствует одномерной кривой Безье.Формула преобразования, которую вы цитируете, должна работать нормально: «координаты» в одномерной кривой Безье - это все скаляры.

Следовательно, на самом деле не имеет смысла пытаться построить одну кривую XNA как двумернуюКривая Безье.Значение времени кривой соответствует параметру Безье t, а не одной из пространственных осей.

Как сказано в документации класса Curve: «Чтобы представить временной путь в двух или трех измерениях, вы можете определить два илитри объекта Curve, каждый из которых соответствует отдельной пространственной оси. "

т.е. вам нужно два объекта Curve, один для предоставления значения x и один для предоставления значения y в определенный момент времени.

...