Как преобразовать кривую "Эрмита" в кривую Безье?
как говорится в теме: Как преобразовать из кривой Эрмита в кривую Безье? В частности, я ищу способ преобразовать класс Curve, который использует интерполяцию Hermite, платформы Microsoft XNA для рисования с помощью 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
даже с этой информацией я по сути застрял на вычислении контрольных точек. Проблема в том, что класс Кривой предоставляет TangentIn и TangentOut как скаляр. Учитывая, что рисование многочлена происходит в 2-мерном пространстве (времени, значении), этот скаляр необходимо преобразовать в 2-мерный вектор, чтобы применить его к этой формуле. Однако я не уверен, какие шаги связаны с этим процессом преобразования, но я подозреваю, что мне нужно применить Hermite уравнение дифференциации.
Если это помогает, это код, используемый для оценки кривой в данный момент, как найти с рефлектором.
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 ответов
Я никогда не использовал XNA, но, взглянув на документацию, кажется, что класс Curve соответствует одномерной кривой Безье. Формула преобразования, которую вы цитируете, должна работать нормально:" координаты " в одномерной кривой Безье-все скаляры.
следовательно, на самом деле нет смысла пытаться построить одну кривую XNA как двумерную кривую Безье. Значение времени кривой соответствует параметру Безье t, а не пространственному ось.
Как говорится в документации по классу кривых: "чтобы представить временной путь в двух или трех измерениях, вы можете определить два или три объекта Кривой, каждый из которых соответствует другой пространственной оси."
т. е. вам нужны два объекта Кривой, один для предоставления значения x и один для предоставления значения y в определенное время.