Вопрос по math, interpolation, c#, bicubic, linear – Кубическая / Кривая Гладкая интерполяция в C # [закрыто]

14

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

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,0f до 1,0f. Если бы вы построили эту кривую, вы бы получили что-то вроде этого:

Expired Imageshack image removed

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

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

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

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

Expired Imageshack image removed

Как одна функция

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

Expired Imageshack image removed

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

Голосовали за то, чтобы закрыть этот вопрос, поскольку он полагается на изображения, чтобы показать, в чем заключается вопрос / проблема, и эти изображения, по-видимому, давно исчезли. Таким образом, вопрос в его нынешнем виде (по моему мнению) не имеет значения и не имеет ответа, потому что никто не знает, на какой вопрос отвечают эти ответы. Lasse Vågsæther Karlsen

Ваш Ответ

3   ответа
3

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

то есть.

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

Если вы хотите иметь касательные, используйте кубический сплайн Эрмита, который я разместил ниже
Я посмотрю, смогу ли я заставить ваше решение работать. Тем не менее, в идеале, я бы просто настроил кубическую функцию в методе: сумма = (сумма * сумма) * (3f - (2f * сумма)); Я предполагаю, что это может быть сделано довольно легко, я просто не уверен, как это сделать. Rob
0

-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;
12

Кубический эрмит сплайн:

alt text

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

спасибо Роберту, за то, что он выглядел ПУТИ красивее :)
Да. Это способ сделать это. Кусочно-кубический интерполят Эрмита обладает приятным свойством, заключающимся в том, что он просто является непрерывным и дифференцируемым в точках излома, потому что задано значение и первая производная на каждом конце интервала. Это, ИМХО, очень симпатичный способ построить кусочно-кубический.

Похожие вопросы