Алгоритмы компьютерной графики. Построение точки на растре. Построение точки (дисплей 256 x 256 точек)

Страницы работы

Содержание работы

Алгоритмы компьютерной графики

Построение точки на растре

Построение точки (дисплей 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. Выделяем 13 разрядов адреса байта (5 старших разрядов
  2. X координаты + 8 разрядов Y координаты)
  3. Формируем код, соответствующий положению «1»
  4. в байте (точки на экране)
  5. Вариант а) Используем 3 младших разряда координаты X
  6. в качестве счетчика числа сдвигов для сдвига
  7. предварительно подготовленной маски 1000000
  8. вправо.

Вариант б) Заводим в памяти все возможные варианты положения «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” Полученный код записываем в видеопамять.

Проблема!

  • Все хорошо, если ставим точку на пустом экране. Если в ВП уже есть сформированная картинка, то существует 2 опасности.
  • Если записывать в память по MOV, то можно затереть соседние биты байта (например, код, записываемый в байт ВП = 00000100, обнулит разряды байта 0, 1, 4-7)
  • Если записывать в память по OR, то можно получить точку другого цвета, так как в двух битах байта ВП может быть уже записан код цвета 10 (тогда (01)OR(10) = 11)
  • Какой выход?

Выход: предварительная очистка двух бит в байте, в которые будет записываться код цвета. Для очистки можно, например, использовать полученную маску, например, 00110000, инвертируем 11001111 и, используя операцию “AND” между инвертированной маской и байтом видеопамяти, производим очистку. Затем записываем код цветной точки в байт по “OR”.

Построение точки в разных графических адаптерах (продолжение)

EGA – 640 x 350 и все другие адаптеры при 16 цветах.

Похожие материалы

Информация о работе