- •06.09.02
- •13.09.02
- •Область применения кг.
- •20.09.02
- •Векторная и растровая графика.
- •Свет излучаемый и свет отраженный.
- •Принципы векторной и растровой графики.
- •Плюсы и минусы растрового способа:
- •Цвет в компьютерной графике.
- •27.09.02
- •Цветной растровый монитор (с элт).
- •Графические адаптеры пк.
- •03.10.02
- •Vga – Video Graphic Adapter.
- •Алгоритмы кг. Построение точки на растре.
- •Алгоритм построения точки на растре по заданным координатам х и y.
- •Построение точки в разных графических адаптерах.
- •11.10.02
- •Произвольные линии.
- •18.10.02
- •Вывод окружностей и символов на экране.
- •Вывод текста на растре.
- •Символы в текстовом режиме.
- •Изображение текста в символьном режиме возникает «на лету».
Алгоритмы кг. Построение точки на растре.
Построение точки (дисплей 256х256 точек).

Объем ВП=32х256байт=8Кб.
|
Х |
Y |
Содержимое байта |
№ байта | |||||||
|
Х=0 |
Y=0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 байт |
|
Х=1 |
Y=0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 байт |
|
Х=2 |
Y=0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 байт |
|
Х=7 |
Y=0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 байт |
|
Х=8 |
Y=0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 байт |
|
Х=9 |
Y=0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 байт |
|
Х=15 |
Y=0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 байт |
Задача:
в байт с адресом 3 записано
Сколько
точек увидим на экране и с какими
координатами?
(Ответ: 2 точки Х1=26 Y1=0 Х2=30 Y2=0).
Что надо сделать, чтобы поставить на темном экране точку с заданными координатами X, Y?
Надо найти адрес байта в видеопамяти и бит, в который необходимо записать 1 (на фоне всех основных нулей в ВП). Для предыдущего случая разрешения 256х256 точек Координаты Х от 0…255 Y от 0…255. Выделим для хранения этих координат 2 регистра. Разрядность регистров – 8 разрядов.

Как зависит адрес байта видеопамяти от координаты Y?
Одна строка развертки – 32 байта ВП, поэтому адрес байта ВП, соответствующий началу строки = 32*Y.
Как зависит адрес байта видеопамяти от координаты Х?
Изменение координаты Х от 0 до 7 - байт №0
Изменение координаты Х от 8 до 15 - байт №1
Адрес байта (относительный) в строке = целое(х/8).

13 бит = адрес байта ВП (213=8192 байта = 8Кб).
Определение положения бита в байте?
Положение бита в байте определяет координата Х. Остаток от деления Х на 8 определяет положение «1» в байте.
Алгоритм построения точки на растре по заданным координатам х и y.
Выделим 13 разрядов адреса байта (5 старших разрядов – координата Х + 8 разрядов – координата Y).
Формируем код, соответствующий положению «1» в байте (точка на экране).
Варианты:
А. Используем 3 младших разряда координаты Х в качестве счетчика числа сдвигов для сдвига
предварительно подготовленной маски 10000000 вправо.

Б. Заводим в памяти все возможные варианты положения «1» в байте и используем 3 младших разряда
координаты Х для выбора у памяти нужного значения. Выделение 3х младших разрядов координаты Х:
|
Координата Х |
01001110 & |
|
Маска |
00000111 |
|
результат |
00000110 |

Построение точки в разных графических адаптерах.
Для четных строк: Адрес байта = целое(Y/2)*80+x/8
Для нечетных строк: Адрес байта = целое(Y/2)*80+x/8+2000h
Определение четности/нечетности строки.
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).
CGA – цветной.
320 точек в строке Х 200 строк развертки. В строке 80 байт, в байте 4 точки. Для четных строк:
Адрес байта = целое(Y/2)*80+x/4. Для нечетных строк: Адрес байта = целое(Y/2)*80+x/4+2000h
Надо найти положение 2х битов цвета в байте. Как это сделать?
Четыре возможных положения битов цвета в байте: ХХ000000 00ХХ0000 0000ХХ00 000000ХХ.
В
ариант:
заводим маску 11000000 и сдвигаем ее вправо
на остаток (Y/4).
Коды цвета представляем в виде байта,
например, 01010101 вместо 01. С найденной
маской положения двух битов цвета и
байтов кода цвета выполняем операцию
«AND».
Полученный код записываем в видеопамять.
ПРОБЛЕМА: все хорошо, если ставим точку на пустом экране. Если же в ВП уже есть сформированная картинка, то существуют 2 опасности:
Если записать в память по mov, то можно затереть соседние биты байта (например, код записываемый в байт ВП =00000100 - обнулит разряды байта 0,1,4,5,6,7,8)
Если записать в память по or, то можно получить точку другого цвета, так как в двух битах байта ВП может быть уже записан код цвета 01, тогда 01 OR 10 = 11.
ВЫХОД: предварительная очистка двух бит в байте, в которые будет записываться код цвета. Для очистки можно , например использовать полученную маску. Например: 00110000 инвертируем 11001111 и используя операцию AND между инвертированной маской и байтом видеопамяти производим очистку. Затем записываем код цветной точки в байт по OR.
