
- •2. Цвет в кг. Аддитивные и субтрактивные цвета. Системы rgb, cmyk.
- •8. Печатающие устройства. Разрешение устройств. Классификация и принцип действия принтеров. Матричный принтер. Струйный принтер. Лазерный принтер.
- •9. Графопостроители. Классификация. Планшетные графопостроители. Графопостроители с переметающимся носителем. Электростатические графопостроители.
- •Кнопки (Buttons)
- •Световое перо (Lightpen)
- •Планшеты (Tabletts)
- •2. Алгоритмы компьютерной графики (теоретический вопрос)
- •1. Генерация векторов. Целочисленный алгоритм Брезенхема.
- •2. Генерация окружностей. Алгоритм Брезенхема.
- •3. Методы устранения ступенчатости. Причини возникновения искажения изображения. Устранение ступенчатости полутонами.
- •4. Заполнение многоугольника. Алгоритм заполнения с затравкой.
- •0.5.1 Простой алгоритм заливки
- •0.5.2 Построчный алгоритм заливки с затравкой
- •0.7.1 Алгоритм Сазерленда-Ходгмана
- •0.7.2 Простой алгоритм отсечения многоугольника
- •0.7.3 Алгоритм отсечения многоугольника Вейлера-Азертона
- •0.2.1 Устройство глаза
- •14. Построение реалистических изображений. Простая модель освещения. Диффузное отражение.
- •15. Построение реалистических изображений. Простая модель освещения. Зеркальное отражение.
- •16. Построение реалистических изображений. Определение нормали к поверхности.
- •17. Построение реалистических изображений. Определение вектора отражения.
- •18. Построение реалистических изображений. Закраска методом Гуро.
- •19. Построение реалистических изображений. Закраска методом Фонга.
- •20. Построение реалистических трехмерных изображений. Удаление невидимых линий и поверхностей.
- •4. Современное программирование трехмерной графики в OpenGl (теоретический вопрос).
- •1. Инициализация пакета OpenGl:
- •2. Описание вершин: определение координат и цвета вершин, вывод точек (настройка режимов вывода).
2. Алгоритмы компьютерной графики (теоретический вопрос)
1. Генерация векторов. Целочисленный алгоритм Брезенхема.
Основная
идея алгоритма состоит в том, что если
угловой коэффициент прямой < 1/2, то
естественно точку, следующую за точкой
(0,0), поставить в позицию (1,0) (рис. а),
а если угловой коэффициент > 1/2, то - в
позицию (1,1) (рис. б). Для принятия
решения куда заносить очередной пиксел
вводится величина отклонения Е точной
позиции от середины между двумя возможными
растровыми точками в направлении
наименьшей относительной координаты.
Знак Е используется как критерий для
выбора ближайшей растровой точки.
Если Е < 0, то точное Y-значение округляется до последнего меньшего целочисленного значения Y, т.е. Y-координата не меняется по сравнению с предыдущей точкой. В противном случае Y увеличивается на 1.
Для вычисления Е без ограничения общности упрощающе положим, что рассматриваемый вектор начинается в точке (0,0) и проходит через точку (4, 1.5) (см. рис. 0.3в), т.е. имеет положительный наклон меньший 1.
Из рис. 0.3в видно, отклонение для первого шага:
|
поэтому для занесения пиксела выбирается точка (1,0).
Отклонение для второго шага вычисляется добавлением приращения Y-координаты для следующей X-позиции (см. рис. 0.3в):
|
поэтому для занесения пиксела выбирается точка (2,1). Так как отклонение считается от Y-координаты, которая теперь увеличилась на 1, то из накопленного отклонения для вычисления последующих отклонений надо вычесть 1:
|
Отклонение для третьего шага:
|
поэтому для занесения пиксела выбирается точка (3,1).
Суммируя и обозначая большими буквами растровые точки, а маленькими - точки вектора, получаем:
|
Возможны случаи:
Е1 > 0 |
E1 0 |
ближайшая точка есть: |
|
X1 = X0 + 1; Y1 = Y0 + 1; |
X1 = X0 + 1; Y1 = Y0; |
E2 = Е1 + Py/Px - 1; |
E2 = E1 + Py/Px. |
Так как интересует только знак Е, то можно избавиться от неудобные частных умножением E на 2×Px:
|
E1 = 2×Py - Px |
E1 > 0: |
E2 = E1 + 2×(Py - Px) |
E1 0: |
E2 = E1 + 2×Py |
Таким образом получается алгоритм, в котором используются только целые числа, сложение, вычитание и сдвиг: X= x1; Y= y1; Px= x2 - x1; Py= y2 - y1; E= 2Py - Px; i= Px; PutPixel(X, Y); /* Первая точка вектора */ while (i= i- 1 0) { if (E 0) { X= X + 1; Y= Y + 1; E= E + 2(Py - Px); } else X= X + 1; E= E + 2Py; PutPixel(X, Y); /* Очередная точка вектора */ }
Этот алгоритм пригоден для случая 0 dY dX. Для других случаев алгоритм строится аналогичным образом.