Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Язык программирования (и ОС) ФОРТ (FORTH) S071: Растровая графика, модель экрана


Информационный Канал Subscribe.Ru

Как показывает (не моя 8-) практика преподавания информатики, наибольший интерес
вызывает программирования графики и особенно игр. Думаю, что лучше всего для
обучения использовать именно программирование игр -- эта область включает самые
разные области computer science, особенно современные игры. Кроме того, я наконец
купил хорошую книжку по компьютерной графике 8-). Еще бы раздобыть бумажную книгу
издательства "Питер" 1995 года по программированию игр (кажется автор -- Ла Мот).


Если ваши языковые системы не позволяют использовать графику или это кажется
вам слишком сложным, можно обойтись выводом модели экрана в виде двумерного массива
точек scr[Xsz][Ysz], содержащего цвета каждого пикселя в виде целого числа (можно
использовать и массив структур, отдельно храня каждую компоненту цвета -- красный
R, зеленый G и синий B). 

Еще один вариант программировать графику на языках, которые не обеспечены удобной
библиотекой 2D графики -- выводить графику в графические файлы (самый простой
формат .bmp) и просматривая из любыми программами типа ASCSee или даже генерируя
.html со вписокм созданных кадров, чтобы смотреть результаты работы ваших программ
в браузере. 

К сожалению, эти "финты ушами" не подходят для игр -- кроме вывода графики, нужно
еще как-то обеспечить и ввод. Я постараюсь дать готовые варианты программирования
интерактивной графики на Python и C(++) под Windows и Linux с использованием
переносимых библиотек. 


S071: Растровая графика, модель экрана

--------------------------------------------------------------------------------
Существует два типа (машинной) графики -- растровая и векторная. 
Самый простой тип графики -- растровая. Самый типичный пример -- экран вашего
компьютера. Изображение состоит из прямоугольной матрицы пикселов, каждый из
которых состоит из трех точек R красного, G зеленого и B синего цветов разной
яркости. В зависимости от соотношения яркостей RGB компонент они сливаются в
одну точку определенного цвета и яркости. 


Экранные координаты
Каждая точка экрана имеет координаты P(x,y), начало координат O(0,0) находится
в левом верхнем углу экрана, ось ОХ направлена вправо, а OY вниз. Обе координаты
задаются целыми неотрицательными (>=0) числами. 


Цвет
Каждый компонент цвета кодируется целым числом, задающим яркость от 0 (точка
погашена) до Cmax (точка светится с максимальной яркостью. На современном графическом
железе (видеокарта+монитор, цветной LCD экран) чаще всего используется кодирование
цветовых компонент 8-битными целыми 00..FF. Тогда цвет каждой точки задается
24 битами -- режим TrueColor 2^24 цветов. Иногда также добавляется еще один байт
-- прозрачность. 

Для экономии памяти или из-за ограничений железа часто используется режимы с
меньшим количеством бит на пиксель до 1 бита/пиксель для черно-белого LCD экрана
(см. например электронные часы). При этом компоненты цвета с различным число
бит/пиксель упаковываются в байты или машинные слова так, чтобы между ними не
было неиспользуемых бит. 

Очень часто вместо указания цвета по цветовым компонентам используется индексированный
режим: цвет точки задается небольшим целым числом (2-16 бит), который является
индексом массива, в котором содержатся цветовые компоненты для каждого цветового
индекса. Этот массив называется палитрой. 

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


Варианты видео-систем
Изображение хранится в специальной видео-памяти на видеокарте или контроллере
графического LCD экрана. Эта память может адресоваться напрямую (EGA, VGA контроллеры
старых ПК, ZX Spectrum), для вывода на экран используются команды, управляющие
графическим контролером (Palm, PocketPC, мобильники) или используется смешанный
вариант (практически все современные видеокарты ПК начиная с первых SVGA). 

Если видеопамять адресуется линейно, то начиная с некоторого адреса адресного
пространства памяти компьютера вместо основного ОЗУ отображается видео-память.
При этом при выполнении команд процессора для записи в этой области памяти изменяется
изображение на экране. Для работы с такой памятью на С(++) можно определить массив:


#define BIT_PER_COLOR_COMPONENT 8
#define Xsz 640
#define Ysz 480

struct PIXEL {
     int R:BIT_PER_COLOR_COMPONENT;
     int G:BIT_PER_COLOR_COMPONENT;
     int B:BIT_PER_COLOR_COMPONENT;
};

PIXEL scr[Xsz*Ysz];

Если 
ваш компилятор С(++) (точнее линкер, создающий файл с программой) позволяет явно
указывать адрес размещения структур данных в памяти, 
упаковывает битовые поля (в определении структуры после : может указываться число
бит для поля структуры), и 
операционная система позволяет работать напрямую с физической памятью,
то указав компилятору/линкеру разместить массив scr[] по адресу начала видеопамяти,
отображенной в основное ОЗУ, вы сможете ставить точку 
scr[0x1234].R=0x12;      // красная компонента цвета точки
scr[0x1234].G=0x34;      // зеленая компонента
scr[0x1234].B=0x56;      // синяя компонента

Обратите внимание, что индекс массива 0x1234 определяет координаты точки. Для
пересчета экранных координат (см. далее) в линейный адрес точки в видеопамяти
нужно учитывать организацию видеопамяти (как хранятся компоненты цвета или индексные
цвета точек). Чаще всего пикселы хранятся построчно по порядку увеличения координаты
Y. 


Задание

Напишите модель на С(++), Python и Форте: 
черно-белого LCD экрана 160x160 (старые КПК Palm 105, IIIxe) 
черно-белого LCD экрана с 256 градациями серого (КПК Sony ) 
экрана компьютера в режиме VGA 640x480 16 цветов (используется в DOSvm) 
экрана компьютера 1024x768 в режиме TrueColor 
графического окна размером 160x120 для режима TrueColor (24 бита) 
экрана вашего мобильника с 65536 цветов 
страницы формата А4, отсканированной на профессиональном сканере с разрешением
600 dpi (сканер использует 12-битные АЦП для каждого цветового канала) 
Модель должна обеспечивать: 

хранение пикселов 
установку точки 
чтение точки 
вывод растра в текстовом формате 
чтение и запись растра в дисковый файл в текстовом формате 
чтение и запись растра в формате .bmp 
Посчитайте объем памяти в байтах, необходимый для хранения одного экрана 1024x768
в режиме TrueColor (24-битный цвет). 
Для вычисления размера на Python используйте его в "калькуляторном" режиме, вводя
числа без оператора print. 
Напишите функции для перевода размера в байтах в размер в килобайтах (Кб, 2^10)
и мегабайтах (Мб, 2^20). 

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.forth
Отписаться
Вспомнить пароль

В избранное