Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.12.2015, 10:21
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию Число в с плавающей запятой поместить в 3 Байта

Добрый день.

Дано: число от 0 до 1 с точностью 9 знаков после запятой.
Необходимо закодировать это число в три байта (каждый байт будет соответствовать каналу RGB) с максимально возможной точностью.

Прочитал про нормализацию чисел. К сожалению в этом алгоритме используется 4ре байта.

Далее пошёл в сторону деления значащих чисел на группы:

Код:
0.298374629
0.29 0.0083 0.000074
RGB(29;83;74)
таким образом могу закодировать только 6ть знаков.

Натолкните на адекватную идею пожалуйста, если такое вообще реализуемо.
Ответить с цитированием
  #2  
Старый 30.12.2015, 11:31
x128 x128 вне форума
Новичок
 
Регистрация: 03.02.2010
Сообщения: 64
Репутация: 133
По умолчанию

Очевидно, что девять знаков в три байта не влезут, т.к. максимально возможное значение 2^24=16777216. Соответственно, чтобы записать число из диапазона 0..1 в три байта с максимально возможной точностью, нужно умножить его на 2^24.
Ответить с цитированием
  #3  
Старый 30.12.2015, 13:46
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от Uniq!
Натолкните на адекватную идею пожалуйста, если такое вообще реализуемо.
Есть две адекватных идеи (из DirectX): либо целые (диапазон 0-255) - 3 байта, либо дробные - 3x4 = 12 байт.
Ответить с цитированием
  #4  
Старый 30.12.2015, 14:30
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от AlexSku
Есть две адекватных идеи (из DirectX): либо целые (диапазон 0-255) - 3 байта, либо дробные - 3x4 = 12 байт.

Я как-то не уловил о чём идёт речь: целые и дробные "кто"?
Ответить с цитированием
  #5  
Старый 31.12.2015, 00:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,034
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, например, как-то так:
Код:
const
  n = 16777216; // 2^24
var
  x : double;
  rgb_raw : integer;
  r, g, b : byte;
  rgb : TColor;
begin
  x := Random; // Get [0..1) number
  rgb_raw := round(x * n); // normalize, so, got value [0..n-1)
  
  // extract chanels
  b := rgb_raw mod 256;
  rgb_raw := rgb_raw div 256;
  g := rgb_raw mod 256;
  r := rgb_raw div 256;
  
  // Get TColor
  rgb := RGB(r,g,b);
end;

Мог где-то немножко напутать, но не думаю, что принципиально.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter