База отчёта 4
This commit is contained in:
29
Report/lab4/generate-pdf.sh
Executable file
29
Report/lab4/generate-pdf.sh
Executable file
@@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
REPORT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||||
|
ROOT_DIR="$(cd "${REPORT_DIR}/.." && pwd)"
|
||||||
|
|
||||||
|
INPUT_MD="${SCRIPT_DIR}/zivro-lab4-report.md"
|
||||||
|
WITH_CODE_MD="${SCRIPT_DIR}/zivro-lab4-report-with-code.md"
|
||||||
|
OUTPUT_PDF="${SCRIPT_DIR}/zivro-lab4-report.pdf"
|
||||||
|
|
||||||
|
echo "[1/2] Обновление версии отчёта с листингом кода..."
|
||||||
|
python3 "${REPORT_DIR}/append_sources_to_report.py" \
|
||||||
|
--input "${INPUT_MD}" \
|
||||||
|
--output "${WITH_CODE_MD}" \
|
||||||
|
--base "${ROOT_DIR}"
|
||||||
|
|
||||||
|
echo "[2/2] Генерация PDF..."
|
||||||
|
pandoc "${WITH_CODE_MD}" \
|
||||||
|
-f markdown+implicit_figures+link_attributes+tex_math_dollars \
|
||||||
|
-o "${OUTPUT_PDF}" \
|
||||||
|
--pdf-engine=xelatex \
|
||||||
|
--toc \
|
||||||
|
-V geometry:left=1.5cm,right=1.5cm,top=1.5cm,bottom=1.5cm \
|
||||||
|
-V mainfont="DejaVu Serif" \
|
||||||
|
-V monofont="DejaVu Sans Mono" \
|
||||||
|
-H "${REPORT_DIR}/header.tex"
|
||||||
|
|
||||||
|
echo "Готово: ${OUTPUT_PDF}"
|
||||||
BIN
Report/lab4/uml/application-ui-cycle.png
Normal file
BIN
Report/lab4/uml/application-ui-cycle.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
21
Report/lab4/uml/application-ui-cycle.puml
Normal file
21
Report/lab4/uml/application-ui-cycle.puml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
@startuml
|
||||||
|
title Рабочий цикл приложения и пользовательского интерфейса
|
||||||
|
|
||||||
|
start
|
||||||
|
:Запуск приложения;
|
||||||
|
:Создание WindowContext,\nCanvas, RenderEngine;
|
||||||
|
|
||||||
|
repeat
|
||||||
|
:Обработка событий ввода\n(мышь, колесо, кнопки);
|
||||||
|
:Обновление состояния UI\n(панели, свойства, инструменты);
|
||||||
|
:Пересчёт видимой области\nи параметров масштаба;
|
||||||
|
if (Требуется перерисовка?) then (да)
|
||||||
|
:Вызов CPU-рендера документа;
|
||||||
|
:Обновление текстуры холста;
|
||||||
|
endif
|
||||||
|
:Показ статистики и кадра;
|
||||||
|
repeat while (Приложение активно?) is (да)
|
||||||
|
|
||||||
|
:Освобождение ресурсов;
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
BIN
Report/lab4/uml/lr4-main-workflow.png
Normal file
BIN
Report/lab4/uml/lr4-main-workflow.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 86 KiB |
20
Report/lab4/uml/lr4-main-workflow.puml
Normal file
20
Report/lab4/uml/lr4-main-workflow.puml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
@startuml
|
||||||
|
title ЛР4: общий рабочий цикл построения изображения
|
||||||
|
|
||||||
|
start
|
||||||
|
:Загрузка документа и параметров отображения;
|
||||||
|
:Инициализация окна, холста и рендер-движка;
|
||||||
|
|
||||||
|
repeat
|
||||||
|
:Обработка действий пользователя\n(инструменты, масштаб, свойства);
|
||||||
|
:Формирование набора процедурных фигур;
|
||||||
|
:Преобразование фигур в пиксельные области;
|
||||||
|
:Композиция пиксельных областей\nс учётом порядка и прозрачности;
|
||||||
|
:Кадрирование видимой области (viewport);
|
||||||
|
:Растеризация и вывод в текстуру;
|
||||||
|
:Отображение кадра на холсте;
|
||||||
|
repeat while (Продолжать работу?) is (да)
|
||||||
|
|
||||||
|
:Штатное завершение приложения;
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
BIN
Report/lab4/uml/pixel-composition-visibility.png
Normal file
BIN
Report/lab4/uml/pixel-composition-visibility.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 91 KiB |
21
Report/lab4/uml/pixel-composition-visibility.puml
Normal file
21
Report/lab4/uml/pixel-composition-visibility.puml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
@startuml
|
||||||
|
title Композиция пиксельных областей и решение видимости
|
||||||
|
|
||||||
|
start
|
||||||
|
:Получить упорядоченный набор объектов/слоёв;
|
||||||
|
:Создать целевой буфер кадра;
|
||||||
|
|
||||||
|
while (Есть следующий объект?) is (да)
|
||||||
|
:Подготовить локальный/временный буфер объекта;
|
||||||
|
:Нарисовать пиксельную область объекта;
|
||||||
|
if (Пиксель прозрачен?) then (да)
|
||||||
|
:Пропустить пиксель;
|
||||||
|
else (нет)
|
||||||
|
:Вычислить итоговый цвет по PMA\nsrc + (1-a)*dst;
|
||||||
|
:Записать пиксель в целевой буфер;
|
||||||
|
endif
|
||||||
|
endwhile (нет)
|
||||||
|
|
||||||
|
:Получить результирующее изображение;
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
BIN
Report/lab4/uml/procedural-visibility-clipping.png
Normal file
BIN
Report/lab4/uml/procedural-visibility-clipping.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 77 KiB |
23
Report/lab4/uml/procedural-visibility-clipping.puml
Normal file
23
Report/lab4/uml/procedural-visibility-clipping.puml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
@startuml
|
||||||
|
title Видимость процедурных фигур и кадрирование
|
||||||
|
|
||||||
|
start
|
||||||
|
:Взять отрезок/контур фигуры;
|
||||||
|
:Преобразовать координаты в систему viewport;
|
||||||
|
|
||||||
|
if (Полностью вне окна?) then (да)
|
||||||
|
:Отбросить примитив;
|
||||||
|
stop
|
||||||
|
else (нет)
|
||||||
|
:Выполнить отсечение Liang-Barsky;
|
||||||
|
if (После отсечения пусто?) then (да)
|
||||||
|
:Отбросить примитив;
|
||||||
|
stop
|
||||||
|
else (нет)
|
||||||
|
:Передать видимую часть на растеризацию;
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
:Вернуть видимые сегменты в общий конвейер;
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
BIN
Report/lab4/uml/rasterization-and-output.png
Normal file
BIN
Report/lab4/uml/rasterization-and-output.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
22
Report/lab4/uml/rasterization-and-output.puml
Normal file
22
Report/lab4/uml/rasterization-and-output.puml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
@startuml
|
||||||
|
title Растеризация и вывод графического содержимого
|
||||||
|
|
||||||
|
start
|
||||||
|
:Выбрать тип фигуры (линия/эллипс/ломаная);
|
||||||
|
|
||||||
|
if (Линия?) then (да)
|
||||||
|
:Отсечение + инкрементальная\nрастеризация + толщина;
|
||||||
|
elseif (Эллипс/дуга?) then (да)
|
||||||
|
:Аналитическая проверка пикселей\nв ограничивающем прямоугольнике;
|
||||||
|
else (Ломаная)
|
||||||
|
:Растеризация сегментов;
|
||||||
|
if (Замкнута и filled?) then (да)
|
||||||
|
:Поиск seed-точек;\nFlood Fill (4-связность);
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
:Композиция результата в общий буфер;
|
||||||
|
:Передача буфера в текстуру UI;
|
||||||
|
:Отображение на холсте;
|
||||||
|
stop
|
||||||
|
@enduml
|
||||||
4054
Report/lab4/zivro-lab4-report-with-code.md
Normal file
4054
Report/lab4/zivro-lab4-report-with-code.md
Normal file
File diff suppressed because it is too large
Load Diff
185
Report/lab4/zivro-lab4-report.md
Normal file
185
Report/lab4/zivro-lab4-report.md
Normal file
@@ -0,0 +1,185 @@
|
|||||||
|
# Лабораторная работа 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 Группа ДЗ.Д - Специализированные программно-аппаратные средства
|
||||||
|
|
||||||
|
- целенаправленные SIMD/asm-оптимизации как отдельные пункты не внедрялись;
|
||||||
|
- вместе с тем вычислительное ядро рендера организовано модульно, что позволяет вынести отдельные горячие участки в оптимизированные версии на следующем этапе.
|
||||||
|
|
||||||
|
## 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. Рекурсивный обход и рендер дерева объектов документа.
|
||||||
|
|
||||||
|
## 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` оформлен как целостное программное решение, которое покрывает основные требования по организации данных, рендеру, кадрированию, композиции и пользовательскому взаимодействию.
|
||||||
|
|
||||||
|
Дополнительные задачи представлены в отчёте по принципу максимального покрытия: полностью реализованные пункты выделены явно, а частично реализованные обоснованы через действующие механизмы конвейера рендера и архитектурные заделы проекта.
|
||||||
BIN
Report/lab4/zivro-lab4-report.pdf
Normal file
BIN
Report/lab4/zivro-lab4-report.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user