Интерполяция значения между двумя значениями

Я ищу функцию, которая интерполирует значение между двумя значениями после мягкой кривой.

Вот пример:

введите описание изображения здесь

float xLerp(float mMin, float mMax, float mFactor) { ... }

mFactor должно быть между 1 и 0.

Как я могу создать функцию, похожую на ту, которую я нарисовал?

1

Решение

Как я уже сказал в комментарии, показатель вписывается довольно хорошо:

double mBase = 5; // higher = more "curvy"double minY = pow(mBase, mMin - mBase);
double maxY = pow(mBase, mMax - mBase);
double scale = (mMax - mMin) / (maxY - minY);
double shift = mMin - minY;
return pow(mBase, mFactor - mBase) * scale + shift;

Тьфу, склон все не так, уродливый хак …

2

Другие решения

Парабола будет работать.

#define ASSERT (cond) // Some assertion macro
/**
* f(x) = a(x)^2 + 0x + c // b is zero, because no x shift.
* f(0) = mMin == c = mMin
* f(1) = mMax == a + mMin = mMax == a = mMax - mMin
*/
float xLerp (float mMin, float mMax, float mFactor) {
ASSERT(0 <= mFactor && mFactor <= 1);
float a = mMax - mMin;
return a * mFactor * mFactor + mMin;
}
2

Синусоида будет работать.

#include <math.h>
#define ASSERT (cond) // some assertion macro
/**
* f(x) = a * sin(x / t * PI) + b
* f(0) = mMin == b = mMin
* f(1) = mMax == a * sin(1/t * pi) + mMin == a * sin(pi/t) = mMax - mMin
*        a = (mMax - mMin) / sin(pi/t)
* (Let t == 1 for "normal" periodicity. 0 < t <= 1)
* a = (mMax - mMin) / sin(pi/t) == a = mMax - mMin
*/
float xLerp (float mMin, float mMax, float mFactor){
ASSERT(0 <= mFactor && mFactor <= 1);
float a = mMax - mMin;
return a * sin(mFactor * PI) + mMin;
}
2
По вопросам рекламы [email protected]