Files
Zivro/Report/lab4/zivro-lab4-report.md

188 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Лабораторная работа 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 (итоговый перечень)
1. Композиция иерархических трансформаций (`Transform.compose`).
2. Конвейер координат: local -> world -> canvas -> viewport.
3. Отсечение отрезка ортогональным окном (Liang-Barsky).
4. Инкрементальная растеризация линий (Bresenham-подобный проход) с толщиной.
5. Аналитическая растеризация эллипса и дуги.
6. Растеризация ломаной и замыкание контура.
7. Выделение границы, выбор seed и flood fill (4-связность) для заливки.
8. Альфа-композиция в premultiplied alpha.
9. Рекурсивный обход и рендер дерева объектов документа.
10. SIMD-ускорение композиции пикселей в `compositeDrawerContext` (`@Vector`, пакетная обработка RGBA).
## 6. UML-диаграммы (PlantUML, русский язык)
### 6.1 Общий рабочий цикл ЛР4
`Report/lab4/uml/lr4-main-workflow.puml`
![Общий рабочий цикл ЛР4](uml/lr4-main-workflow.png)
### 6.2 Композиция пиксельных областей и видимость
`Report/lab4/uml/pixel-composition-visibility.puml`
![Композиция пиксельных областей и видимость](uml/pixel-composition-visibility.png)
### 6.3 Решение видимости процедурных фигур и кадрирование
`Report/lab4/uml/procedural-visibility-clipping.puml`
![Видимость процедурных фигур и кадрирование](uml/procedural-visibility-clipping.png)
### 6.4 Растеризация и вывод графического содержимого
`Report/lab4/uml/rasterization-and-output.puml`
![Растеризация и вывод](uml/rasterization-and-output.png)
### 6.5 Основной рабочий цикл приложения и UI
`Report/lab4/uml/application-ui-cycle.puml`
![Рабочий цикл приложения и UI](uml/application-ui-cycle.png)
## 7. Вывод
В рамках ЛР4 проект `Zivro` оформлен как целостное программное решение, которое покрывает основные требования по организации данных, рендеру, кадрированию, композиции и пользовательскому взаимодействию.
Дополнительные задачи представлены в отчёте по принципу максимального покрытия: полностью реализованные пункты выделены явно, а частично реализованные обоснованы через действующие механизмы конвейера рендера и архитектурные заделы проекта.