Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2009, 00:06   #11
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Для вашей задачи больше подойдет работа с цветом в формате HSL чем RGB. Вот первое на что наткнулся: http://www.vr-online.ru/topic.php?id=12708
Вот что получилось:Сортировка цветов.zip
На сколько я понял, существует несколько способов из RGB получить HSL. Они отличаются не только кодом, но и результатом.
Кстати, обратите внимание на:
Код:
...
procedure ColorToHSL(Color: TColor; out H, S, L: byte);
var
  R, G, B, D, Cmax, Cmin, HL: Integer;
begin
  R := TRGBQuad (Color).rgbBlue;
  G := TRGBQuad (Color).rgbGreen;
  B := TRGBQuad (Color).rgbRed;
...
Sibedir вне форума Ответить с цитированием
Старый 27.09.2009, 01:15   #12
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

2Sebedir, спасибо конечно, но всё равно не совсем то что надо

Щас попробую поглубже разораться...
Altera вне форума Ответить с цитированием
Старый 27.09.2009, 01:36   #13
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Если работать с RGB цветом, то спектр можно условно разделить на три части, в к-рых разные компоненты цвета то идут на убыль то поднимаются. Кстати это наводит на мысль о синусоиде, может ее тут заюзать? У разных компонентов цвета будут разные фазы.

p/s Нарисовал на листике, действительно так и есть, три синусоиды к-рые отличаются по фазе. Вот тебе и значения R G B.


Вот код, и результат его работы
Код:
uses
  Math;

var
  r, g, b: byte;
  i: integer;
begin
  for I := 0 to 360 do begin
    r:=Round(128+cos(DegToRad(i))*128);
    g:=Round(128+cos(DegToRad(i+240))*128);
    b:=Round(128+cos(DegToRad(i+120))*128);
    Canvas.Pen.Color:=RGB(r,g,b);
    Canvas.MoveTo(i, 0);
    Canvas.LineTo(i, 50);
  end;
end;
Красный цвет совпадает с косинусом, зеленый - сдвинут по фазе на 240 град., синий на 120.
Но за счет того что синусоида имеет плавную форму, чистых цветов на границах нет (желтого например), тут нужно синусоиду как бы дискретной сделать, с линейными (по диагонали) перепадами, и плоскими пиками равным по длине перепаду * 2. Плюс черные полосы нужно разобраться что тут делают.
Изображения
Тип файла: png spectrum.png (6.2 Кб, 174 просмотров)
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 27.09.2009 в 14:02.
mutabor вне форума Ответить с цитированием
Старый 28.09.2009, 17:33   #14
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Ещё вот что подумал:
1) Отсортировать все цвета в одномерном пространстве нельзя. Только со 100% насыщенностью
2) Нужно двумерное - как в фотошопе, например
TwiX вне форума Ответить с цитированием
Старый 28.09.2009, 17:39   #15
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

И как ты себе представляешь вертикальный столбик (список) цветов в 2-х мерном порядке?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 28.09.2009, 18:23   #16
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Я как раз говорю что такое невозможно простым алгоритмом:
Цитата:
1) Отсортировать все цвета в одномерном пространстве нельзя. Только со 100% насыщенностью
нужен не стобик, а сетка тогда уж)
TwiX вне форума Ответить с цитированием
Старый 28.09.2009, 18:59   #17
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

надо как минимум к максимальному контрасту привести.
Altera вне форума Ответить с цитированием
Старый 28.09.2009, 22:25   #18
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

^это называется 100%насыщенность)
TwiX вне форума Ответить с цитированием
Старый 29.09.2009, 07:52   #19
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Блин, интересная оказывается тема

Цитата:
Сообщение от TwiX
Отсортировать все цвета в одномерном пространстве нельзя...
И виной тому две вещи: физика и математика.
С точки зрения физики цвет - это функция типа:
Color = f (V)
, где
V - это вектор из N-ого кол-ва параметров d, A;
d - длина волны;
A - амплитуда;
N - количество волн.
Таким образом, цвет - это функция трех независимых аргументов.
А с точки зрения математики функцию от N независимых аргументов нельзя преобразовать в функцию от (N - C) аргументов, где C - больше 0.
Сортировка по списку - это упорядочивание по одному из параметров. Аргументы можно преобразовывать сколь угодно, но их все равно будет три и при сортировке вам придется поступится двумя из них.
Я предлагаю разбить цвета на группы, близкие по содержанию, по одним параметрам и отсортировать каждую группу по другому параметру:
Сортировка цветов.zip
P.S.: mutabor, то о чем вы пишите и есть оттенок, который можно получить процедурой ColorToHSL (параметр H). Оттенков, кстати действительно должно быть 360, а не 255. Только вот на счет синусоиды я не уверен. Мне кажется, там все-таки кусочно-линейная зависимость.
Sibedir вне форума Ответить с цитированием
Старый 29.09.2009, 09:39   #20
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Плюс черные полосы нужно разобраться что тут делают.
2mutabor, это не чёрные полосы: открой картинку в пеинте и увеличь до 8 раз. Это видемо результат функции больше чем $00FFFFFF (16 777 216)
Щас разберусь
Код:
procedure Tmain_form.PaintBox1Paint(Sender: TObject);
var
  r, g, b: word;
  i: integer;
begin
  for I := 0 to 360 do begin
    r:=Round(128+cos(DegToRad(i))*128);
    g:=Round(128+cos(DegToRad(i+240))*128);
    b:=Round(128+cos(DegToRad(i+120))*128);

    if r > 255 then r := 255;
    if g > 255 then g := 255;
    if b > 255 then b := 255;

    PaintBox1.Canvas.Pen.Color:=RGB(r,g,b);
    PaintBox1.Canvas.MoveTo(i, 0);
    PaintBox1.Canvas.LineTo(i, 50);
  end;
end;

Последний раз редактировалось Altera; 29.09.2009 в 10:00.
Altera вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Затемнение и осветление цветов. proglamer Мультимедиа в Delphi 1 02.12.2008 16:09
Получение 2х цветов и их сравнение Zeraim Помощь студентам 3 26.04.2008 15:43
Сравнивание цветов Zeraim Общие вопросы Delphi 7 26.04.2008 12:49
Копирование текста ячейки 2 цветов WIC Microsoft Office Excel 3 24.09.2007 13:32
Прозрачность для нескольких цветов в Image SERG1980 Общие вопросы Delphi 3 11.05.2007 19:53