forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Математика (http://forum.boolean.name/forumdisplay.php?f=85)
-   -   Не линейная зависимость чисел (http://forum.boolean.name/showthread.php?t=17720)

CRASHER 06.01.2013 17:19

Не линейная зависимость чисел
 
Известен ли вам наиболее простой способ привязать число к другому числу. К примеру некое А изменяется от 0 до 100, а некое В изменяется от 0 до 5 или от 5 до 10(просто кпримеру). Причем изменение В происходит только когда А<=20 и А>=0. То есть А=0 В=0; A=5 B=0.8(или сколько там) и.т.д. Так вот какие есть способы. В голову приходят только такие варианты. если А(0,50) В(0,5) то В=А/10. А если мне надо будет в случае А>50 начать уменьшать В. Как такие зависимости выстроить? обычным условием? Надеюсь не слишком цифрами и примерами загрузил)

jimon 06.01.2013 18:37

Ответ: Не линейная зависимость чисел
 
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 19:51

Ответ: Не линейная зависимость чисел
 
Млииин!)) Умно то как!!))) Пасиб, очень полезное знание!)
единственное когда ты подставлял числа ты b1 не заменил, забыл наверн. А так ваще шикарно!))

CRASHER 06.01.2013 21:41

Ответ: Не линейная зависимость чисел
 
А как переименовать тему?


Часовой пояс GMT +4, время: 09:21.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot