Кубическая / кривая гладкая интерполяция в C# [закрыто]

Ниже приведена кубическая функция интерполяции:

public float Smooth(float start, float end, float amount)
{
    // Clamp to 0-1;
    amount = (amount > 1f) ? 1f : amount;
    amount = (amount < 0f) ? 0f : amount;

    // Cubicly adjust the amount value.
    amount = (amount * amount) * (3f - (2f * amount));

    return (start + ((end - start) * amount));
}

эта функция будет кубически интерполировать между начальным и конечным значением, заданным величиной между 0.0 f-1.0 f. Если бы вы построили эту кривую, вы бы получили что-то вроде этого:

истек Imageshack изображение удалено

кубическая функция здесь:

    amount = (amount * amount) * (3f - (2f * amount));

Как настроить это, чтобы произвести два тангенса В и из?

для того чтобы произвести кривые, подобные этому: (линейное начало до кубического конца)

истек Imageshack изображение удалено

как одна из функций

и как это еще одно: (кубическое начало до линейного конца)

истек Imageshack изображение удалено

у кого-нибудь есть идеи? Спасибо заранее.

3 ответов


Что вы хотите-это Кубический Сплайн Эрмита:

alt text

где p0-начальная точка, p1-конечная точка, m0-начальная касательная, а m1-конечная касательная


вы можете иметь линейную интерполяцию и кубическую интерполяцию и интерполировать между двумя функциями интерполяции.

ie.

cubic(t) = cubic interpolation
linear(t) = linear interpolation
cubic_to_linear(t) = linear(t)*t + cubic(t)*(1-t)
linear_to_cubic(t) = cubic(t)*t + linear(t)*(1-t)

где t колеблется от 0...1


ну, простой способ был бы таков:

-Expand your function by 2 x and y
-Move 1 to the left and 1 down
Example: f(x) = -2x³+3x²
g(x) = 2 * [-2((x-1)/2)³+3((x-1)/2)²] - 1

или программно (кубическая настройка):

double amountsub1div2 = (amount + 1) / 2;
amount = -4 * amountsub1div2 * amountsub1div2 * amountsub1div2 + 6 * amountsub1div2 * amountsub1div2 - 1;

для другого, просто оставьте вне "двигать":

g(x) = 2 * [-2(x/2)³+3(x/2)²]

или программно (кубическая настройка):

double amountdiv2 = amount / 2;
amount = -4 * amountdiv2 * amountdiv2 * amountdiv2 + 6 * amountdiv2 * amountdiv2;