IPB
ЛогинПароль:

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> RGB --> 256, переход между палитрами
сообщение
Сообщение #1


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Добрый день!
Собственно нужна функция на ФП которая получая RGB-параметры возвращала бы номер этого(или максимально близкого к этому цвету) в стандартной палитре. [ RGBToP(const r, g, b:word):word; ]
Желательно БЕЗ использования асм.
Поиск особых результатов не дал(кроме не к чему не ведущей темы 2003-года)

заранее благодарен


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 51
Пол: Мужской

Репутация: -  0  +


Цитата

нужна функция на ФП которая получая RGB-параметры возвращала бы номер этого(или максимально близкого к этому цвету) в стандартной палитре. [ RGBToP(const r, g, b:word):word; ]


стандартная палитра - это наверно VGA-палитра. Тогда в ней 256 цветов. Я её объявил как RGBPalette.
Если это не так, то нужно просто поменять верхний диапазон для массива TRGBPalette и для цикла for.
В любом случае массив RGBPalette необходимо каким-либо образом инициализировать(например считать из файла).

Самое главное нужно понять, что три компоненты цвета можно соотнести с тремя координатами пространства.
Можно попробовать на бумаге нарисовать систему координат с тремя осями, только вместо X, Y и Z написать
Red, Green и Blue. Так как компоненты цвета больше или равны нулю(принимают значения от 0 до 255),
то рассматривать придётся только один октант(1/8) RGB-пространства: Red - 0..255; Green - 0..255; Blue - 0..255.
Все цвета(и цвета "стандартной" палитры и цвет, передаваемый в функцию) - это ТОЧКИ RGB-пространства,
а компоненты цвета(Red, Green и Blue) - это КООРДИНАТЫ ЭТИХ ТОЧЕК. Массив RGBPalette - это 256 разноцветных точек в кубе RGB-пространства, цвет, передаваемый в функцию, - ещё одна цветная точка в этом кубе(я задал её переменной X). Точки с ПОХОЖИМ цветом находятся БЛИЖЕ ДРУГ К ДРУГУ. То есть нужно просто находить расстояния в RGB-пространстве(оно ТРЁХМЕРНОЕ - Red,Green,Blue) от точки X до точек RGBPalette и выбрать из них наименьшее. Этим и занимается ранее приведённый фрагмент кода.

Как вычисляются расстояния в N-мерных пространствах?
Точки A и B с координатами (X1,X2,...,XN).
Одно измеренние - одна координата(X1). S = Abs(A.X1 - B.X1).
Два измерения - две координаты(X1,X2). S = Sqrt( Sqr(A.X1 - B.X1) + Sqr(A.X2 - B.X2) ).
Три измерения - три координаты(X1,X2.X3). S = Sqrt( Sqr(A.X1 - B.X1) + Sqr(A.X2 - B.X2) + Sqr(A.X3 - B.X3)).
Тьфу, уже не помню в каком классе средней школы это проходят. Без обид.
P.S.
Ну, можно сказать, что эти формулы основаны на теореме Пифагора.
Не знаю, что ещё написать по этому поводу.

Сообщение отредактировано: Neznaika -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.12.2022 12:41
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name