| compiler |
11.08.2007 15:58
Сообщение
#1
|
|
Человек ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Добрый день!
Собственно нужна функция на ФП которая получая RGB-параметры возвращала бы номер этого(или максимально близкого к этому цвету) в стандартной палитре. [ RGBToP(const r, g, b:word):word; ] Желательно БЕЗ использования асм. Поиск особых результатов не дал(кроме не к чему не ведущей темы 2003-года) заранее благодарен -------------------- Спасибо!
Удачи! |
![]() ![]() |
| Neznaika |
11.08.2007 18:34
Сообщение
#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 - 11.08.2007 18:35 |
compiler RGB --> 256 11.08.2007 15:58
Neznaika Оооо, я когда-то решал эту задачу. Её нужно было р... 11.08.2007 17:15
compiler Что-то я не совсем понял...
Итак разбиваем всю па... 11.08.2007 17:34
volvo Ты для каких режимов хочешь это делать? Если у теб... 11.08.2007 18:00
compiler Ты для каких режимов хочешь это делать? Если у теб... 11.08.2007 18:09
volvo
Обычное использование: сначала создается палитра ... 11.08.2007 18:48
Neznaika По-моему самый простой(и наглядный) пример использ... 11.08.2007 19:45
Neznaika Ответ-велосипед. Функция, которая требовалась изна... 12.08.2007 13:00
Archon http://www.enlight.ru/demo/faq/smth.phtml?query=al... 12.08.2007 18:02![]() ![]() |
|
Текстовая версия | 15.11.2025 13:02 |