Показать сообщение отдельно
Старый 06.01.2013, 18:37   #2
jimon
 
Сообщений: n/a
Ответ: Не линейная зависимость чисел

A от 0 (a1) до 100 (a2)
B от 5 (b1) до 10 (b2) когда A от 0 (a3) до 20 (a4)

идея в том что мы строим воображаемый график зависимости значения B от некоторого параметра t, скажем если t = 0 то B = b1, если t = 1 то B = b2
потом мы преобразовываем нужный нам промежуток значений A в значение t, помним что t не может быть меньше 0 и не может быть больше 1

float clamp(x, a, b)
{
	return min(max(x, a), b);
}

float t = clamp((A - a3) / (a4 - a3), 0.0, 1.0);
B = t * (b2 - b1) + b1
если подставить числа

float t = clamp((A - 0) / (20 - 0), 0.0, 1.0)
B = t * (10 - 5) + b1
если зависимость B от t сложнее одной функции то результат считают через условия :

float t = ...

if(t < 0.4) // часть от [0.0, 0.4) где 0.4 не включительно
{
	float t2 = (t - 0.0) / (0.4 - 0.0); // t2 уже будет от 0 до 1 для этого сегмента
	B = t2 * ...
}
else if(t < 0.8) // часть [0.4, 0.8)
{
	float t2 = (t - 0.4) / (0.8 - 0.4);
	B = ...
}
else // часть [0.8, 1.0]
{
	float t2 = (t - 0.8) / (1.0 - 0.8);
	B = ...
}
правда в последнем примере нужно быть немного осторожным, ведь по-сути значение t2 в условиях никогда (кроме последнего) не достигает еденицы, но в общем из-за неточности представления чисел с плавающей запятой и неточностей накладываемых системой анимации то можно забить
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
CRASHER (06.01.2013)