Ответ 1
Что вам нужно, это Cubic Hermite Spline:
где p0 - начальная точка, p1 - конечная точка, m0 - тангенс начала, а m1 - тангенс конца
Ниже представлена кубическая интерполяционная функция:
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. Если бы вы построили эту кривую, у вас получилось бы что-то вроде этого:
Удалено изображение с удаленным снимком
Кубическая функция здесь:
amount = (amount * amount) * (3f - (2f * amount));
Как мне настроить это для создания двух выходных тангенсов?
Чтобы создать такие кривые: (Линейное начало до кубического конца)
Удалено изображение с удаленным снимком
Как одна функция
и как это как другое: (Кубический старт до линейного конца)
Удалено изображение с удаленным снимком
У кого-нибудь есть идеи? Спасибо заранее.
Что вам нужно, это Cubic Hermite Spline:
где p0 - начальная точка, p1 - конечная точка, m0 - тангенс начала, а m1 - тангенс конца
вы можете иметь линейную интерполяцию и кубическую интерполяцию и интерполировать между двумя функциями интерполяции.
т.
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;