[Ответить в тред] Ответить в тред

03/04/16 - Набор в модераторы 03.04 по 8.04
26/03/16 - Конкурс: Помоги гомункулу обрести семью!
15/10/15 - Набор в модераторы 15.10 по 17.10



[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 9 | 1 | 3
Назад Вниз Каталог Обновить

Алгоритм простенький вопрос Аноним 13/06/16 Пнд 21:48:52  768848  
14658437325620.jpg (285Кб, 962x1376)
Аноны, мне нужно один диапазон чисел преобразовать в другой, с сохраненим пропорциональности, чтобы например середина первого легла в середину второго, а концы в концы, и тд. Например из [1500...2000] сделать [100...4000].
1500 => 100.000000
1700 => 1660.000000
1800 => 2440.000000
2000 => 4000.000000

У меня получилась вот такая формула, x - входное значение и

(x - min1) / (max1 - min1) * (max2 - min2) + min2

(x - min1) / (max1 - min1) - находим где на первом отрезке находится значение x, (0.5 - посередине и тд), потом умножаем на (max2 - min2) чтобы спроецировать на второй отрезок и прибавляем сдвиг min2.

Тащемта тривиально и работает верно, но все таки интересно - можно ли поэлегантнее, в меньше действий?
Аноним 13/06/16 Пнд 22:21:08  768858
>>768848 (OP)
Все норм. Теперь уебывай. Тред закроют.
Аноним 14/06/16 Втр 16:15:05  769310
>>768848 (OP)
Ну если у тебя много разных чисел необходимо перевести, то можешь развернуть формулу:

x (max2 - min2) / (max1 - min1) - min1 (max2 - min2) / (max1 - min1) + min2

(max2 - min2) / (max1 - min1), min1 * (max2 - min2) / (max1 - min1) и min2 у тебя не будут часто изменяемыми, поэтому их можно рассчитать заранее. В итоге будет только 4 + 3 действия для каждого числа вместо 6 на каждое.
Аноним 14/06/16 Втр 16:19:15  769316
>>769310
Точнее даже 5 + 2 действия на каждое число.
Аноним 14/06/16 Втр 16:47:56  769341
>>769310
Да много, непрерывный поток конвертируется, возможно придется запихивать в прерывание, то есть нужна оптимизация по скорости. Да, наверное есть смысл развернуть, спасибо за идею.

>>768858
Что не так с тредом?
Аноним 14/06/16 Втр 17:22:20  769360
Не, хотелось бы конечно развернуть прямо в красивое уравнение прямой y=mx + b, но тогда придется делать в вещественных числах, но не на всех моих корах есть FPU, поэтому боюсь что только медленнее станет.
Аноним 14/06/16 Втр 17:36:11  769369
>>769360
Ты думаешь, что станет медленнее, чем изначально?
Аноним 14/06/16 Втр 17:51:09  769388
>>769369
Не знаю, надо сравнивать. Кажется все-таки можно в целых, ведь линейное преобразование, типа умножить сперва, потом разделить, сейчас попробую.
Аноним 14/06/16 Втр 18:01:43  769394
Вот так наверное оптимально, развернуто и в целых числах

float m = (float)(bn-b0)/(float)(an-a0);
int b = (float)(b0 - a0m)1024;
int mm = m 1024 + 0.5;
...
printf ("%d => %d\n", i, (i
mm + b)>>10);

Аноним 14/06/16 Втр 18:04:44  769395
тест разметки

[code
int a0 = 1170, an = 1870, b0 = 700, bn = 2000;
float m = (float)(bn-b0)/(float)(an-a0);
int b = (float)(b0 - a0m)1024;
int mm = m 1024 + 0.5;

for (int i = a0; i <= an; i += 100)
{
printf ("%d => %d\n", i, (i - a0)
(bn-b0)/(an-a0) + b0);
printf ("%d => %d\n", i, (i*mm + b)>>10);
}


[/code]

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 9 | 1 | 3
Назад Вверх Каталог Обновить

Топ тредов