- •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
- •Вывод окружностей и символов на экране.
- •Вывод текста на растре.
- •Символы в текстовом режиме.
- •Изображение текста в символьном режиме возникает «на лету».
11.10.02
Лекция 6
EGA. Постановка точки.
(EGA 640x350, VGA 640x480).
Адрес байта = Y*80 + целое(X/8).
Положение бита в байте определяется , как в ч/б CGA.
VGA 256 цветов.
Адрес байта = Y*N+X, где N – размер изображения по горизонтали (ширина изображения в пикселях).
Горизонтальные и вертикальные линии.
Вертикальные линии:

PUTPIXEL – такое построение не обеспечивает достаточную скорость. Мы должны строить линию работая с байтами и битами, то есть непосредственно в ВП, что намного ускоряет построение линии, в отличии от данного метода.
|
0 |
|
Адрес байта для четных строк |
|
1 |
+2000h |
Получаем нечетную строку |
|
2 |
+2000h +5h (+80) |
Снова получаем четную строку |
|
3 |
+2000h |
Снова получаем нечетную строку |

Горизонтальные линии:

Нужно
каждый раз проверять, не закончился ли
байт
нужно циклически сдвигать маску. Надо
каждый раз при построении горизонтальной
линии проверять, не перешли ли мы через
границу байта. Если границу перешли ,
то к адресу байта надо добавлять 1. при
определении перехода через границу
байта проверяем, есть ли целые байты в
оставшейся части линии
делим оставшуюся длину линии на 8 и
смотрим целую часть и если есть целый
байт мы
пишем FFh
(11111111). Оставшуюся нецелую часть линии
строим как и в начале по точкам.
Произвольные линии.
Координаты концов линии задаем целочисленно.

Предположим: Х1>Х2, и α ≤450. Будем продвигать значение координаты Х от Х1 до Х2 и находить для каждой координаты Х значение Y. (Если α >450, то надо для Y находить Х). Y=m*X+b m=tg α m=|Y2-Y1|/| X2-X1|. Для обеспечения необходимой точности нужно работать с плавающей точкой и каждый раз производить округление Y. На каждом шаге координата Х меняется на 1, в этом случае Y меняется на m (исчезает операция умножения: Хi+1=Xi+1 Yi+1=Yi+m ).
Брезенхэм:

T или S – какая из них следующая? Если Ti >= Si S (координата Y не меняется), Ti < Si T (координата Y меняется Yi+1=Yi+-1).
Алгоритм построения Брезенхэма: он ввел некоторую переменную di=(s-t). Если di<0, то Yi+1=Yi и следующее значение di находится так: di+1= di+2 dy (2) (dy=|Y2 – Y1|), еслиdi ≥ 0, тогда Yi+1=Yi+-1 и следующее значение di: di+1= di – 2*( dy - dх) (3) гдеdy=|Y2 – Y1|,dх=|Х2 – Х1|. Начальное значениеdi определяется по формуле: : d1= 2 dy - dх (1) .
Примеры:
В случае горизонтальной линии
d1=
2 dy
(=0) - dх
<0
Y=const.

Если α >450 , тогда меняем на каждом шаге на 1 координату Y и используем те же формулы для определения di , но в котором dx и dy поменяны местами. Достоинство алгоритма – это сложение и сдвиги, используется целочисленная арифметика и точность построения линии не более 0,5 пикселя.
Пример:
|
di |
Х |
Y |
|
|
5 |
5 |
|
-1 |
6 |
5 |
|
5 |
7 |
5 |
|
-3 |
8 |
6 |
|
3 |
9 |
6 |
|
-5 |
10 |
7 |
|
1 |
11 |
8 |
|
-7 |
12 |
8 |

18.10.02
Лекция 7
Вывод окружностей и символов на экране.
Окружность строится октантом (1/8 частью)


Для каждого значения Х мы можем менять координату Хi и каждый раз находить координату Yi
Проблемы:
Надо искать квадраты.
Извлечение квадратного корня – долгая операция.
Требуется работа с вещественными числами.
Требуется округление.
Алгоритм построения Брезенхэма: Строим окружность в октанте, пока Хi не станет ≥ Yi.

d1=3 – 2*R
di<0 Si (Y=const) di+1= di+4*Xi-1+6
di≥ 0 Ti (Yi= Yi-1+-1) di+1= di+4*(Xi-1 - Yi-1)+10
Алгоритм построения Стародубцева (ЛИТМО):
1. На каждом шаге находим сумму Xi и сравниваем эти значения с координатой Y. Если сумма Xi ≥Y, то координату Y меняем и находим новое значение суммы: ∑Х = ∑Х - Yi
Пример: Алгоритм ЛИТМО.
|
Х |
Y |
∑Х |
|
0 |
10 |
0 |
|
1 |
10 |
1 (0+1)< Y10 |
|
2 |
10 |
3 (1+2)< Y10 |
|
3 |
10 |
6 (3+3)< Y10 |
|
4 |
9 |
10 (6+4) ≥ Y10 |
|
|
0 (10-10) Новое значение суммы | |
|
5 |
9 |
5 (0+5)< Y9 |
|
6 |
8 |
11(5+6) ≥ Y9 |
|
|
2 (11-9) Новое значение суммы | |
|
7 |
7 |
9 (2+7) ≥ Y8 |
|
Х=Y |
Алгоритм закончен | |

Сложение: 1-2 операции, сравнивание: 1 операция, в сумме: 2-3 операции. (Алгоритм ЛИТМО).
Сложение: 2-3 операции, сравнивание: 1 операция, сдвиги: 2 операции, в сумме: 5-6 операций. (Алгоритм Брезенхэма).
Анализ алгоритма ЛИТМО показал, что точность уступает алгоритму Брезенхэма (=0,6 пикселя).
Модифицированный алгоритм для повышения точности:
Надо сравнивать не с Y, а с Y/2 в сумме: 3-4 операции (появилась операция сдвига (деления)).
