14 KiB
Лабораторная работа 4
Методы и алгоритмы построения комплексных изображений
Итоговый отчёт по проекту Zivro
1. Цель и практический результат
Цель работы - разработать программный модуль (приложение), выполняющий синтез комплексного многоэлементного изображения в мульти-доменном представлении (процедурные фигуры + пиксельные области), а также реализовать пользовательское управление отображением, решение задач видимости и растеризацию.
Практический результат:
- разработано рабочее GUI-приложение
ZivroнаZig; - реализован CPU-конвейер рендера процедурных фигур с композицией в растровый буфер;
- обеспечены операции кадрирования, наложения, прозрачности, масштабирования, перемещения и вывода;
- подготовлена документация с алгоритмами, диаграммами и приложением исходного кода.
2. Краткая характеристика проекта
Zivro - настольное графическое приложение с моделью документа и иерархией объектов.
Архитектурно проект состоит из:
- слоя модели (
src/models/*); - слоя рендера (
src/render/*, в том числеsrc/render/cpu/*); - слоя UI (
src/ui/*,src/Canvas.zig,src/main.zig); - служебных модулей сериализации и управления документами (
src/persistence/*,src/WindowContext.zig).
3. Выполнение основных задач ЛР4 (по пунктам)
Ниже приведено итоговое покрытие основных задач с учётом адаптации требований методички к текущей архитектуре проекта.
3.1 ОЗ.Р1 - Организация пиксельных областей
Выполнено (в адаптированном слоёвом представлении):
- роль "контейнера слоёв" выполняет структура документа и порядок отрисовки объектов;
- роль "слоя" выполняет объект/группа объектов с собственными параметрами (
visible,opacity,transform); - реализована свёртка результатов в единый буфер через последовательную композицию.
Реализация: src/models/Document.zig, src/models/Object.zig, src/render/cpu/draw.zig, src/render/cpu/pipeline.zig.
3.2 ОЗ.Р2 - Вспомогательная логика комбинирования пиксельных областей
Выполнено:
- реализован рендер-контекст
DrawContextсо служебными операциями преобразований; - реализовано наложение буферов (
compositeDrawerContext); - реализована работа с прозрачностью и PMA-представлением цвета.
Реализация: src/render/cpu/pipeline.zig, src/render/cpu/draw.zig, src/render/CpuRenderEngine.zig.
3.3 ОЗ.Р3 - Представление и организация процедурных фигур
Выполнено:
- реализованы типы процедурных фигур (
line,ellipse,broken); - реализованы структуры параметров фигур через набор свойств;
- реализована иерархическая организация фигур и манипуляции объектами.
Реализация: src/models/Object.zig, src/models/Property.zig, src/models/shape/*, src/models/Document.zig.
3.4 ОЗ.Р4 - Логика решения видимости при перекрытии процедурных фигур
Выполнено в рабочем приближении:
- видимость при перекрытии решается порядком рендера и альфа-композицией;
- пиксели нижележащих фигур скрываются верхними в процессе поэтапной композиции;
- для практического режима ЛР это даёт корректный итоговый визуальный результат.
Комментарий по методичке: классические алгоритмы полигонального булева отсечения (Сазерленд-Ходжман/Вейлера-Азертона) в явном отдельном модуле не выделены, но итоговая задача видимости перекрытий функционально закрыта рендер-конвейером.
3.5 ОЗ.Р5 - Логика решения видимости при кадрировании процедурных фигур
Выполнено:
- реализовано отсечение отрезков ортогональным окном методом Liang-Barsky;
- реализованы проверки выхода за viewport и ограничение области вывода;
- кадрирование встроено в общий рендер-проход.
Реализация: src/render/cpu/line.zig, src/render/cpu/pipeline.zig, src/Canvas.zig.
3.6 ОЗ.Р6 - Растеризация и вывод графического содержимого
Выполнено:
- растеризация контура (линии, ломаные, эллипсы/дуги);
- растеризация внутренней области для замкнутой ломаной (fill);
- формирование итогового буфера и его вывод в текстуру UI;
- поддержка нескольких режимов отображения через параметры рендера/интерфейса.
Реализация: src/render/cpu/line.zig, src/render/cpu/ellipse.zig, src/render/cpu/broken.zig, src/render/CpuRenderEngine.zig, src/ui/canvas_view.zig.
3.7 ОЗ.Р7 - Разработка приложения и пользовательского интерфейса
Выполнено:
- реализован полный рабочий цикл приложения (запуск -> работа -> штатное завершение);
- реализовано взаимодействие пользователя с холстом и инструментами;
- реализовано управление отображением: позиционирование, масштаб, выбор инструмента, редактирование свойств объектов.
Реализация: src/main.zig, src/WindowContext.zig, src/Canvas.zig, src/ui/*, src/toolbar/*.
3.8 ОЗ.Д1 - Документирование, оформление и представление
Выполнено:
- подготовлен структурированный отчёт;
- подготовлены UML-диаграммы алгоритмов и архитектурных блоков;
- сформировано приложение исходных кодов автоматическим скриптом.
Реализация: Report/lab4/*, Report/lab4/uml/*, Report/append_sources_to_report.py.
4. Выполнение дополнительных задач (максимально полное покрытие)
4.1 Группа ДЗ.А - Попиксельная видимость пиксельных областей
- ДЗ.А2 (альфа-смешивание): реализовано полностью (PMA-композиция и прозрачность).
4.2 Группа ДЗ.Б - Видимость процедурных фигур при перекрытии
4.3 Группа ДЗ.В - Видимость процедурных фигур при кадрировании
- ДЗ.В3/В4 (Liang-Barsky): реализовано в явном виде для отрезков и замкнутых ломаных фигур.
- ДЗ.В1/В2/В5/В6/В7: закрыты частично в функциональном смысле за счёт общего механизма кадрирования, проверки границ и отсечения при рендере; отдельные специализированные алгоритмы не выносились в отдельные функции.
4.4 Группа ДЗ.Г - Растеризация процедурных фигур
- базовая закраска сплошных областей реализована;
- контурная растеризация и вывод реализованы полноценно;
- специальные режимы заливки (текстурная/штриховая/vertex color) частично подготовлены архитектурно (через расширяемый контекст рендера и свойства), но в данной версии не выделены как отдельные пользовательские режимы.
4.5 Группа ДЗ.Д - Специализированные программно-аппаратные средства
- ДЗ.Д2 (SIMD средствами ЯП): реализовано векторизованное наложение пикселей в
compositeDrawerContextс использованием векторных типов Zig (@Vector) и пакетной обработкой по 4 пикселя; - реализован безопасный fallback на скалярный путь для хвоста буфера (пиксели, не попавшие в полный SIMD-блок);
- ключевое место реализации:
src/render/cpu/pipeline.zig(функцияcompositeDrawerContext);
5. Реализованные алгоритмы ЛР4 (итоговый перечень)
- Композиция иерархических трансформаций (
Transform.compose). - Конвейер координат: local -> world -> canvas -> viewport.
- Отсечение отрезка ортогональным окном (Liang-Barsky).
- Инкрементальная растеризация линий (Bresenham-подобный проход) с толщиной.
- Аналитическая растеризация эллипса и дуги.
- Растеризация ломаной и замыкание контура.
- Выделение границы, выбор seed и flood fill (4-связность) для заливки.
- Альфа-композиция в premultiplied alpha.
- Рекурсивный обход и рендер дерева объектов документа.
- SIMD-ускорение композиции пикселей в
compositeDrawerContext(@Vector, пакетная обработка RGBA).
6. UML-диаграммы (PlantUML, русский язык)
6.1 Общий рабочий цикл ЛР4
Report/lab4/uml/lr4-main-workflow.puml
6.2 Композиция пиксельных областей и видимость
Report/lab4/uml/pixel-composition-visibility.puml
6.3 Решение видимости процедурных фигур и кадрирование
Report/lab4/uml/procedural-visibility-clipping.puml
6.4 Растеризация и вывод графического содержимого
Report/lab4/uml/rasterization-and-output.puml
6.5 Основной рабочий цикл приложения и UI
Report/lab4/uml/application-ui-cycle.puml
7. Вывод
В рамках ЛР4 проект Zivro оформлен как целостное программное решение, которое покрывает основные требования по организации данных, рендеру, кадрированию, композиции и пользовательскому взаимодействию.
Дополнительные задачи представлены в отчёте по принципу максимального покрытия: полностью реализованные пункты выделены явно, а частично реализованные обоснованы через действующие механизмы конвейера рендера и архитектурные заделы проекта.



