Непрерывная палитра, содержащая все цвета

Сложная задача!

Известно, что цвет трехмерен (RGB), а плоскость экрана двумерная. Задача заключается в том, что бы нарисовать на экране непрерывную палитру, содержащую все цвета.

Для решения задачи вам потребуется немного теории.

Дадим критерий непрерывной палитры:
Две соседних точки (по вертикали или горизонтали), имеющие цвета (R1, G1, B1) и (R2, G2, B2) соответственно должны удовлетворять следующему равенству:
Abs (R1 - R2) + Abs (G1 - G2) + Abs (B1- B2) = 1

В задаче необходимо оперировать палитрой из 4096 цветов (на некоторых мобильных телефонах, к примеру, такая). В ней каждая компонента цвета 4-х разрядная, следовательно, принимает значения от 0 до 15.

Вам потребуется функция преобразования RGB-цвета из данной палитры в 24-х битный цвет экрана. Так же вы должны уметь выводить точки произвольного цвета на экран.

Учитывая сложность задачи, решения принимаются и от преподавателей, и от студентов не только 1-го курса. Готов ответить на все вопросы, не связанные напрямую с решением задачи, например, как рисовать точки и т.п.

4.57143
Your rating: Нет Average: 4.6 (7 votes)

Комментарии

Каким оператором рисовать

Каким оператором рисовать точки?

Политра будет вида

--------------------------

--------------------------

--------------------------

Где каждая строчка имеет свой цвет?

Возможен ли вывод объекта по его ASCII коду, к примеру write(#0141). Типо такого. И если возможно, то не знаете ли вы, какой код имеет символ - черный квадрат.

 

Количество точек будет 4096,

Количество точек будет 4096, т.к. столько цветов в палитре.

Для вывода палитры необходимо создать оконное приложение в Делфи. Рисовать можно прямо на форму. Для вывода точки есть такой метод: Canvas.Pixels[X,Y].

Например:

Canvas.Pixels[X,Y] := clRed;

Отобразит красную точку с координатами X,Y.

Нам же нужно выводить точки произвольного цвета, пример:

Canvas.Pixels[X,Y] := RGB (R, G, B);

R, G, B - компоненты цвета (красная, зеленая и синяя), каждая из которых может принимать значение от 0 до 255.

Я вроде бы решил, только

Я вроде бы решил, только палитра получилась прямоугольная. Решение выслал на почту.

Файл получил. О форма палитры

Файл получил. О форма палитры ничего не сказано, может прямоугольная, может круглая, может квадратная, я не знаю Laughing

если мне не изменяет память

если мне не изменяет память то каждая из компонента цвета представляется в шестнадцатиричной системе от 00 до FF

возможно я ошибаюсь...

Это если цвет 24-битный, т.е.

Это если цвет 24-битный, т.е. по 1 байту на компоненту.

Но палитры разные бывают. В данной задаче мы рассматриваем 12-битный цвет (4096 вариантов). Дело в том, что вывести все возможные цвета из 24-битной палитры не возможно из-за нехватки размеров экрана (потребуется более 16 мегапикселей). А для 12-битной нужно всего 4096 пикселей.

А Вы можете разместить в

А Вы можете разместить в своем блоге статью введение в графику в делфи. Очень хочется поробовать решить Вашу задачу, ну или хотя бы узнать немного больше. Но дело в том, что я вообще не имею ни малейшего представления по этой теме. Я не знаю, например, что такое форма (прочитала в Вашем комменте), и т.п. А если нет, то киньте мне хотя бы полезные ссылки по теме. Только не заумные. А то я не пойму. Я пыталась искать, но ничего внятного и понятного не нашла. Embarassed

Вот тут:

Вот тут: http://programmersclub.ru/book/

можно скачать электронные книги по Делфи. Изучайте.

Здесь: http://programmersclub.ru/labgrafica/

есть исходники, демонстрирующие примеры работы с графикой в Делфи. Хотя, в данной задачи нужно знать самую малость: только как выводить на форму (окно приложения) точки произвольного цвета.

Вот, еще есть уроки Делфи для начинающего: http://programmersclub.ru/files/32_lessons.rar

Спасибо! Сейчас посмотрю

Спасибо! Сейчас посмотрю

Прошу повысить

Прошу повысить активность!
Пока есть только 1 вариант решения.
Задача не столь уж и сложная, тем более, у более старших курсов не должно быть проблемы с графикой в Делфи. А первокурсники могут освоить материал, т.к. там всё достаточно просто.

Решение ABogomolov верное.

Решение ABogomolov верное. Должен получиться прямоугольник 256*16 точек такого вида:

pallete

Однако задачу не закрываю. Теперь у вас есть внешний вид палитры, которую нужно получить. Жду идеи по поводу того, как такую палитру сформировать. Писать можно прямо здесь в комментариях.

 var r,g,b:integer;    

  1.  var r,g,b:integer;
  2.     x,y:integer;
  3. begin
  4.   x := 0;
  5.   y := 0;
  6.   for x := 0 to 15 do Begin
  7.     for y := 0 to ((16*16)-1) do Begin
  8.       r := x;
  9.       g := y div 16;
  10.       if (((y div 16) mod 2) = 0) then Begin
  11.         b := y mod 16;
  12.       End else Begin
  13.         b := 15-(y mod 16);
  14.       end;
  15.       { Здесь нужно перевести цвета в нужный формат и нарисовать пиксель в кординатах x,y/////я просто не знаю как.... }
  16.     end;
  17.   end;
  18. end;

а в остальном программа правельная?