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

Начальное значение di можно найти как d1 = 2dy – dx (3) Для вычисления по формулам (1), (2) и (3) требуются минимальные арифметические возможности: сложение, вычитание и сдвиг влево (умножение на 2). Задача: построить отрезок с координатами x1 = 5, y1 = 5, x2 = 12, y2 = 8.

Построение окружности на растре

Пусть центр окружности - в начале координат Тогда x2 + y2 = R2 и отсюда можно найти значение y для заданных x, пробегая x от 0 до R с шагом = 1 пикселю:

Y

5

4

3

1

2

2

1

0

X

1

2

3

4

5

Однако, при этом часть окружности в сегменте 2 будет иметь недостаточное количество точек

Кроме того, требуются операции умножения и извлечения квадратного корня. Работа с вещественными числами. Процесс построения можно улучшить, если полнее использовать симметрию окружности. Если точка лежит на окружности, очень просто вычислить семь других точек. Уравнение можно применить для сектора окружности 45о, т.е. от X = 0 до X = Y.

x1,y1

x2 = y1

y2 = x1

1

8

x2,y2

2

7

Аналогично для других частей окружности (с учетом знаков!)

3

6

4

5

Алгоритм построения окружности Брезенхэма

Как и в алгоритме построения отрезка прямой линии на растре используется алгоритм выбора точки на растре, которая является Ближайшей к истинной окружности, т.е. минимизируется ошибка

Выбор ближайших точек производится при помощи управляющих переменных, значения которых вычисляются в пошаговом режиме с использованием лишь небольшого числа сложений, вычитаний и сдвигов.

d1 = 3 – 2R Если di < 0, то -> Si и di+1 = di + 4xi-1 +6 Если di ≥ 0, то -> Ti и di+1 = di + 4(xi-1 – yi-1) + 10

Si

Ti

Точность – ½ пикселя Количество операций: сложения – 2-3 сдвигов – 2 сравнения -1 Всего операций = 5-6

Алгоритм построения окружности ИТМО

В первом сегменте на каждом шаге увеличиваем x на единицу и находим xi, которую сравниваем с yi. Если xi< yi, то yi = yi-1, т.е. координата y не меняется. Если xi≥ yi, то yi = yi-1 -1, т.е. координата y меняется, и xi+1 = xi - yi-1. Заканчиваем, когда xi становится ≥ yi . Количество операций: сложений – 1 вычитаний (иногда) – 1, т.е. сложений 1-2 Сравнений - 1 Всего операций 2-3. Точность алгоритма –для некоторых (небольших) радиусов чуть хуже ½пикселя. Пример построения для R=10.

Модифицированный алгоритм построения окружности ИТМО

Для повышения точности (для некоторых значений радиуса) сравнения xi следует производить не с yi, а с yi/2. Добавляется одна операция сдвига, т.е. в этом случае общее количество операций составит 3-4.

Вывод символов на экран

2 режима: текстовый и графический. В текстовом режиме символы выводятся «на лету»

Символы представляется в виде Растра 8 х 8 пикселей. В знакогенераторе (обычно ПЗУ) изображение символа хранится в двоичном виде срезов, начиная сверху вниз. В шестнадцатиричной системе: 7F, 08, …, 08, 00.

80 символов в строке

1 2 3 4 5

знакоместо

Экран

25

Буфер кадра, в котором хранятся коды символов, соответствующие определенному знакоместу (код символа - 1 байт появляется при нажатии клавиши на клавиатуре). Т.о., размер буфера кадра 80 х 25 символов, плюс коды атрибутов символов (цвет, мигание и пр.), т.е. всего 4000 байт.

Всего в знакогенераторе 256 символов х 8 байт развертки символа: 2Кбайт. Для доступа к изображению символа в знакогенераторе надо код символа умножить на 8. Это будет начало развертки символа в знако- генераторе. Для выбора нужного среза символа (байта) требуется учитывать номер строки развертки. Остаток от деления № строки развертки на 8 дает смещение среза символа в знакогенераторе относительно начала изображения этого символа. Таким образом, синхронно с движением луча развертки на экране из знакогенератора выбирается байт среза символа, и каждый бит этого байта последовательно управляет яркостью луча электронной пушки. Поэтому вывод символов в текстовом режиме происходит, как мы сказала в самом начале, «на лету».

В графическом режиме символы могут быть в виде растровой картинки (как в текстовом режиме) или в векторном формате. При этом изображения символов надо занести в видеопамять (ВП). Если символ хранится в виде растра, то могут быть разные варианты. Если, например, символы выводятся на экран с позиционированием в одно знакоместо, и размер растра символа 8х8 бит, то особых трудностей по занесению информации в ВП не должно быть: надо побайтно выбирать срезы символов из знакогенератора и переносить их в соответствующие байты видеопамяти. Однако, если нужно выводить символы на экран с точностью до одного пикселя или размер растра символа составляет, например, 12х10 пикселей, то части изображения символа оказываются в разных (соседних) байтах ВП, и приходится срезы символов записывать в ВП по частям.

В случае векторного представления символов, их надо растеризовать, т.е. векторное изображение каждого символа преобразовать в растровое. При этом может учитываться масштаб представления символов, их поворот и пр.