2012-01-26 4 views
2

Итак, я искал интерполяцию в последнее время. К сожалению, почти каждая статья, которую я прочитал, обсуждает только интерполяцию на десятичном уровне от 0.0 до 1.0. Я хотел бы интерполировать целые числа целого числа независимо от того, насколько они велики или нет или нет. Я сделал это с линейной интерполяцией:Интерполяция косинуса с помощью целых чисел

public int interpolate(int y1, int y2, int length, int x){ 
    return y1 + x * (y2 - y1)/(length-1); 
} 

Однако я застрял с интерполяцией косинуса. This отличная статья говорит о косинусной интерполяции, однако она находится в системе чисел от 0.0 до 1.0, как указано выше. Вот то, что я до сих пор:

public int interpolate(int y1, int y2, int length, int x){ 
    int v = (int)(y2 - Mathf.Cos(x * 3.1415f))/2; 
    return (y1 + x * (y2 - y1)/(length-1)) * v; 
} 

Это не работает, хотя он возвращает почти случайное число с не реальное направление не делает его не гладкой на всех. Здесь мне нужна ваша помощь. Короче говоря: как сделать функцию интерполяции косинуса, которая имеет дело с целыми числами?

+3

Вы, кажется, неправильно поняли статью, с которой вы связались. Он не говорит, что его система чисел от 0.0 до 1.0; скорее, он говорит, что вы должны установить mu = 0, когда вы находитесь на первой конечной точке, и mu = 1, когда вы находитесь на конечной точке. Итак, если ваши конечные точки (x1, y1) и (x2, y2), и вы хотите интерполировать по x, то mu = x1 + (x-x1)/(x2-x1). – ruakh

+0

@руах не должен быть mu = (x-x1)/(x2-x1)? – pkExec

+0

@pkExec: Упс, да, спасибо. – ruakh

ответ

1

Вам нужно

(int) ((1+cos(pi*x/(length-1)))/2 * (y1-y2)+y2) 

косинус идет от 1 до -1, как угол от 0 до пи. Добавьте 1 и разделите на два, и вы получите хорошую функцию, которая идет от 1 до 0. Остальное преобразует аргумент.

+0

Он работает, однако кажется, что он переворачивает цифры. Если я установил y1, чтобы сказать 20 и y2 - 50, тогда результат будет интерполяцией от 50 до 20, а не от 20 до 50. – MrSplosion

+0

Затем просто переключайте y1 и y2 вокруг. Я отредактировал формулу для вас. – Joni