2009-07-18 2 views
14

Ниже кубической функцией интерполяции:Куб/Кривая Гладкая интерполяция в 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.0f - 1.0f. Если бы вы были построить эту кривую, вы бы в конечном итоге с чем-то вроде этого:

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

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

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

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

Для получения кривых, как это: (линейный начинают кубических конец)

Expired Imageshack изображения удалены

В одной функции

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

Истекшие изображенияХак изображение удалено

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

+2

Проголосовало, чтобы закрыть этот вопрос, так как он полагается на изображения, чтобы показать, что вопрос/проблема, d эти изображения, видимо, давно прошли.Вопрос, стоящий, таким образом, (на мой взгляд), не имеет ценности и не имеет ответа, потому что никто не знает, на какой вопрос ответят эти ответы. –

ответ

12

То, что вы хотите это Cubic Hermite Spline:

alt text

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

+1

, спасибо Роберту за то, что он выглядел лучше! :) –

+1

Да. Это способ сделать это. Кусочно-кубический интерполятор Эрмита обладает приятным свойством, что он просто гарантирован как непрерывный, так и дифференцируемый по точкам разрыва, поскольку задано значение и первая производная на каждом конце интервала. Это, ИМХО, очень красивый способ создания кусочной кубики. – 2009-07-18 08:25:53

3

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

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) 

где т в диапазоне от 0 ... 1

+0

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

+1

Если вы хотите иметь касательные, используйте Cubic Hermite Spline, который я разместил ниже –

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; 
Смежные вопросы