Компьютерная графика. Лекция 2

YOUTUBE · 01.12.2025 06:09

Ключевые темы и таймкоды

Введение в графическую библиотеку

0:00
  • Обсуждение создания базовой графической библиотеки.
  • Упоминание о программе, которая заполняет экран.
  • Объяснение необходимости библиотеки для прикладных программ.

Начало работы с цветом

0:52
  • Введение процедуры `set-color` для задания цвета рисования.
  • Сравнение с библиотекой из Turbo Pascal.
  • Описание двух подходов к управлению цветом: текущий цвет и кисть.

Текущий цвет и его реализация

2:37
  • Объяснение понятия текущего цвета, общего для линий и областей.
  • Импорт модуля `Display` для работы с цветами.
  • Реализация процедуры `set-color` для запоминания заданного цвета.

Инициализация модуля

5:22
  • Определение текущего цвета при запуске программы.
  • Установка чёрного цвета по умолчанию.
  • Определение констант для основных цветов: чёрный `BLACK`, белый `WHITE`, красный `RED`, зелёный `GREEN`, синий `BLUE`.

Дополнительные цвета

8:05
  • Описание дополнительных цветов: жёлтый `YELLOW`, малиновый/пурпурный `MAGENTA`, бирюзовый `CYAN`.
  • Объяснение состава каждого цвета.
  • Возможность добавления других констант по необходимости.

Компиляция и настройка фона

9:35
  • Компиляция модуля с ошибкой из-за отсутствия точки с запятой.
  • Настройка фонового цвета с помощью процедуры `set_color`.
  • Объяснение, что фоновый цвет используется при очистке экрана.

Очистка экрана

11:20
  • По умолчанию фон белый.
  • Использование процедуры `clear_device` для очистки экрана.
  • Описание процесса очистки экрана через массив `elb`.

Тестирование библиотеки

13:56
  • Импорт модуля `bg_test` для тестирования.
  • Открытие графического окна и его очистка.
  • Использование двойной буферизации и функции `draw` для отображения экрана.

Рисование точки

17:48
  • Функция `put_pixel` для рисования точки.
  • Задание координат и цвета точки.
  • Запись цвета в массив `elb` на основе координат.

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

20:33
  • Пример рисования точки в центре экрана.
  • Определение координат с помощью констант из библиотеки.
  • Рисование нескольких точек вокруг центральной.

Оптимизация алгоритмов

27:01
  • Важность быстродействия в компьютерной графике.
  • Сравнение скорости выполнения арифметических операций с целыми и вещественными числами.
  • Рекомендации по оптимизации алгоритмов: избегать вещественных чисел, минимизировать умножение и деление.

Сравнение операций

29:59
  • Быстрое выполнение сравнений `меньше`, `больше`, `равно`.
  • Фокус на арифметических операциях для оптимизации алгоритмов.

Введение и старые таблицы

30:59
  • Автор показывает старую таблицу с данными о компьютере Pentium 100, купленном в 1996 году.
  • Упоминает о поиске новой таблицы с данными о скорости выполнения операций.

История растровых изображений

32:44
  • Рассказывает о создании растрового изображения в 1980–1981 годах без графических дисплеев.
  • Объясняет, как оцифровывал портрет, используя кодирование длин серий.
  • Делится опытом работы с примитивными двухцветными изображениями.

Технические детали о печатающих устройствах

34:43
  • Описывает эра печатающих устройств, которые были популярны с 1960-х по середину 1980-х годов.
  • Упоминает о возможности создания изображений с тончайшими оттенками серого.

Анализ скорости операций

36:42
  • Обсуждает скорость выполнения операций на Pentium 100: сравнение — 49,274 миллиона операций в секунду, прибавление единицы — 1 такт, прибавление константы — 2 такта.
  • Сравнивает скорость умножения и деления, отмечая значительное замедление при делении.

Вещественные операции

38:42
  • Рассматривает операции с вещественными числами на примере типа double.
  • Подчёркивает, что вещественные операции выполняются медленнее целых.

Растровые алгоритмы

41:41
  • Объясняет концепцию растровой развёртки отрезка и окружности.
  • Даёт определения четырёхсвязного и восьмисвязного множеств точек.

Задача рисования отрезка

44:40
  • Формулирует задачу рисования отрезка с заданными координатами.
  • Обсуждает различные принципы закраски пикселей для создания отрезка.

Восьмисвязная развёртка

46:40
  • Предлагает использовать восьмисвязную развёртку для улучшения визуального восприятия.
  • Определяет коэффициент наклона отрезка и ограничивает рассмотрение отрезков с наклоном не более 45 градусов.

Введение в алгоритм ЦДА

47:40
  • Тангенс 45 градусов равен единице, тангенс 0 равен нулю.
  • Отрезки, наклоненные к горизонтали, ближе к истинному отрезку, чем вертикальные.
  • При каждом значении x закрашивается один пиксель, центр которого ближе к истинному отрезку.

Принцип работы алгоритма

48:39
  • Идеальный отрезок пересекает место ровно посередине.
  • Можно выбрать любой пиксель на одинаковом расстоянии от отрезка.
  • Алгоритм ЦДА использует дифференциальное уравнение для нахождения решения.

Описание алгоритма ЦДА

49:38
  • Уравнение отрезка: dy/dx = const.
  • Нахождение решения дифференциального уравнения при начальных условиях.
  • Вычисление значения y на истинном отрезке и округление до ближайшего пикселя.

Начало реализации алгоритма

51:38
  • Создание процедуры line для рисования отрезка.
  • Изменение переменной x на единицу при наклоне отрезка к оси x.
  • Вычисление значения y на истинном отрезке.

Вычисление коэффициента k

54:08
  • Коэффициент k вычисляется как y2 - y1 / x2 - x1.
  • Использование вещественных чисел для более точной работы алгоритма.
  • Подготовка переменных для работы с вещественными числами.

Реализация алгоритма в программе

58:06
  • Установка первой точки с помощью подпикселя.
  • Округление y для определения ближайшей точки к истинному отрезку.
  • Проверка работы алгоритма на примере отрезка.

Тестирование алгоритма

1:01:06
  • Рисование отрезка из верхнего левого угла вправо.
  • Проверка качества изображения отрезка.
  • Замечание о зазубренности линии из-за отсутствия гладких линий.

Расширение алгоритма для других случаев

1:04:04
  • Введение переменных dX и dY для определения направления отрезка.
  • Обработка случаев, когда x1 > x2 и x2 > x1.
  • Упрощение программы за счёт использования переменных для начальных и конечных точек.

Проверка деления на ноль

1:07:49
  • Проверка делителя при делении на ноль.
  • Подтверждение, что dX не равно нулю, так как dX > dY.
  • Избегание деления на ноль для корректной работы алгоритма.

Замена переменных

1:08:49
  • Переменные «икс» и «игрек» меняются местами.
  • Знаменатели становятся «игреками».
  • Если «до игрек» больше нуля, то «икс» заменяется на «игрек».

Ручная замена переменных

1:09:47
  • Попытка автоматической замены переменных через Ctrl+R не удаётся из-за отсутствия выделенной области.
  • Замена выполняется вручную: «игрек» заменяется на «икс», и наоборот.

Учёт особых случаев

1:11:47
  • Рассматривается случай, когда «до игрек» равно нулю.
  • Если «до игрек» равно нулю и не больше «д икс», то «д икс» равно нулю.
  • Отрезок превращается в точку, если «икс один» совпадает с «икс два», а «игрек один» совпадает с «игрек два».

Проверка кода

1:13:47
  • Проверка кода на наличие ошибок, включая необходимость дополнительной скобки.
  • Запуск старого теста для проверки работы кода.

Рисование отрезков

1:15:47
  • Рисование различных отрезков: вертикальных, горизонтальных и наклонных.
  • Использование разных цветов для отрезков.

Сглаживание отрезков

1:20:30
  • Обсуждение алгоритма сглаживания отрезков с помощью алиасинга.
  • Объяснение, как пиксели, находящиеся в «ямках» лесенки, закрашиваются смесью цветов для создания более гладкого эффекта.

Случайные отрезки

1:22:30
  • Рисование множества случайных отрезков с координатами, генерируемыми функцией «рандом».
  • Обсуждение функционального программирования и побочных эффектов функций.

Разноцветные отрезки

1:25:28
  • Генерация случайных цветов для отрезков в диапазоне 256^3.
  • Демонстрация быстрой работы программы при рисовании тысячи отрезков.

Заключение

1:27:28
  • Анонс следующего алгоритма, использующего целочисленную арифметику.
  • Благодарность зрителям и призыв к подписке.