Алгоритмы компьютерной графики
Построение точки на растре
Построение точки (дисплей 256 x 256 точек)
ВП
256 точек = 32 байта
7 бит
0 бит
0 байт
0 байт
31 байт
X
7 бит
0
0 бит
. . . .
256
Объем ВП = 32 x 256 байт = 8 K байт
8191 байт
8191 байт
Y
0 байт
X = 0, Y = 0
0 байт
X = 1, Y = 0
0 байт
X = 2, Y = 0
0 байт
X = 7, Y = 0
1 байт
X = 8, Y = 0
1 байт
X = 9, Y = 0
1 байт
X = 15, Y = 0
Задача: в байт с адресом 3 записано
Сколько точек увидим на экране и с какими координатами?
Что надо сделать, чтобы поставить на темном экране точку с заданными координатами X, Y ?
Надо найти адрес байта в видеопамяти и бит, в который необходимо записать 1 (на фоне всех остальных нулей в ВП).
Для предыдущего случая разрешения 256 х 256 точек…. Координата X = 0…255, Y = 0…255 Выделим для хранения этих координат 2 регистра. Разрядность регистров ???
Y
X
Видеопамять
8 разрядов
8 разрядов
Как зависит адрес байта ВП от координаты Y?
Зависимость адреса байта ВП от координаты Y: Одна строка развертки - 32 байта ВП. Поэтому адрес байта ВП, соответствующий началу строки, = 32 * Y.
Как зависит адрес байта ВП от координаты X?
Зависимость адреса байта ВП от координаты X: Изменение координаты X от 0 до 7 – байт № 0 Изменение координаты X от 8 до 15 – байт № 1 Адрес байта (относительный) в строке = целое (X/8)
Y
X
8 бит адрес байта начала строки (Y* 32)
3 бита = ?
5 бит целое (X/8)
13 бит ?
13 бит адресу байта ВП (213 = 8192 байта = 8К байт)
Определение положения бита в байте: Положение бита в байте определяет координата X. Каким образом?
0 байт
X = 0, Y = 0
0 байт
X = 1, Y = 0
Это было!
0 байт
X = 2, Y = 0
0 байт
X = 7, Y = 0
Остаток от деления X на 8 определяет положение «1» в байте.
Алгоритм построения точки на растре по заданным координатам X и Y продолжение)
Вариант б) Заводим в памяти все возможные варианты положения «1» в байте: 10000000 01000000 00100000 ………… 0000001 и используем 3 младших разряда координаты X для выбора из памяти нужного значения. Выделением трех младших разрядов координаты X: координата X = 01001110 маска = 00000111& результат = 00000110
Построение точки в разных графических адаптерах
CGA черно/белый
Для четных строк: Адрес байта = = целое (Y/2)*80 + целое (X/8)
0 байт
79 байт
1 байт
X
0 1 2 3
Экран
200 строк
В байте 8 точек
640 точек = 80 байт в строке
Для нечетных строк: Адрес байта = целое(Y/2)*80+целое(X/8)+ 2000H
199
Y
Определение четности/нечетности строки: Y сдвигаем вправо на 1 бит = Y/2 (что тоже требуется и по соответствующему признаку в регистре флагов осуществляем переход (либо без добавления 2000H, либо с добавлением)
Умножение Y/2 на 80 Y/2 * 80 = Y/2 * (16 + 64) Y/2 сдвиг влево на 4 разряда (Y/2 * 16) Запоминаем Y/2 * 16 (Y/2 * 16) сдвиг влево на 2 разряда (Y/2 * 64) Сложение (Y/2 * 16) и (Y/2 * 64) Y/2 * 80 не равно Y * 40 !!!
Построение точки в разных графических адаптерах (продолжение)
CGA - цветной
320 точек в строке x 200 строк развертки В строке 80 байт, в байте 4 точки
Для четных строк: Адрес байта = = целое (Y/2)*80 + целое(X/4) (в байте 4 точки)
Для нечетных строк: Адрес байта = = 2000H + целое (Y/2)*80 + целое(X/4)
Надо найти положение двух битов цвета в байте. Биты цвета 00, 01, 10 или 11
Как это сделать?
Надо найти положение двух битов цвета в байте. Биты цвета 00, 01, 10 или 11
4 возможных положения битов цвета в байте: XX000000, 00XX0000, 0000XX00 и 000000XX.
Вариант: заводим маску 11000000 и сдвигаем ее вправо на остаток (X/4). Коды цвета представляем в виде байта, например, 01010101 вместо 01. С найденной маской положения двух битов цвета и байтом кода цвета выполняем операцию “AND” Полученный код записываем в видеопамять.
Проблема!
Выход: предварительная очистка двух бит в байте, в которые будет записываться код цвета. Для очистки можно, например, использовать полученную маску, например, 00110000, инвертируем 11001111 и, используя операцию “AND” между инвертированной маской и байтом видеопамяти, производим очистку. Затем записываем код цветной точки в байт по “OR”.
Построение точки в разных графических адаптерах (продолжение)
EGA – 640 x 350 и все другие адаптеры при 16 цветах.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.