Задача Пазл (FIT9201SURNAME_Puzzle)
ЗАДАЧА НА ОЦЕНКУ
Срок выполнения
Рекомендуемая сдача: 9 марта
Крайний срок: 16 марта
Принято решение, что задача будет оцениваться как все последующие.
Предисловие
Задача на программную растеризацию 2d линий и треугольников с текстурой, билинейную фильтрацию и альфа-смешивание, выбор виртуальных объектов, работу с часами и ресурсными файлами .qrc. В задаче используется изображение 128x128 с альфа-каналом, которое разбивается на 2d треугольники. Треугольники размещаются аффинными преобразованиями на плоскости. Ребра треугольников растеризуются алгоритмом Брезенхема. Приложение позволяет просматривать анимацию разбиения/сборки исходного изображения и показывает статистику растеризации для треугольника под курсором мыши.
Условия
Элементы пользовательского интерфейса приложения
1. Окно поддерживает произвольные размеры - тянем курсором мыши за край окна
2. Область рисования занимает большую часть окна и изменяется автоматически
3. Исходное изображение в начальном положении занимает около 16/81 области рисования (центр).
4. Кнопка Init - сбрасывает текущее положение анимации и задает координаты траектории анимации
5. Слайдер анимации - круговой, задает текущее положение анимации [0..360]; 0 - собрано, 180 - разобрано, 360 - собрано.
6. Кнопка Start/Stop - запустить/прекратить анимацию
7. Переключатель Filter - включение/выключение билинейной фильтрации
8. Переключатель Blend - включение/выключение альфа-смешивания
9. Строка состояния - отображает информацию о треугольнике под курсором
Логика приложения
Ваше приложение должно уметь визуализировать анимацию разбиения изображения на треугольники. В качестве исходного изображения используется уменьшенный фрагмент изображения Lena Söderberg, используемого для проверки алгоритмов обработки изображений. Скачать его необходимо с этой страницы и загружать в приложении через ресурсы: :/images/puzzle.png При этом изображение должно находится в папке с проектом и загружаться при любом расположении на диске директории проекта.
Исходное изображение состоит из четырех каналов: красный, зеленый, синий, альфа. Альфа отвечает за прозрачность. Максимум соответствует отсутствию прозрачности. Для визуализации полупрозрачных пикселей требуется реализовать стандартное альфа смешивание, которое может быть выключено переключателем Blend (например, QCheckBox). Далее представлен пример визуализации по стандартной формуле альфа-смешивания: dest_rgb = (1.0 - src_a) * dest_rgb + src_a * src_rgb
Для раскраски пикселей треугольника используется текстурирование. Соответствие поверхности треугольника фрагменту изображения задается текстурными координатами (uv-координаты) - точки в пространстве текстуры. Необходимо задавать эти значения в вершинах треугольника и на этапе растеризации линейно интерполировать их по треугольнику. Далее приводится пример задания текстурных координат.
Любая текстура (изображение) состоит из элементов изображения - текселей (ед. число - тексель). При визуализации треугольника получаются пиксели, в центрах которых текстурные координаты равны некоторым вещественным значениям. Они определяют координаты, по которым производится выборка из текстуры. В общем случае, эти значения не совпадают с координатами центров текселей. При округлении до ближнего текселя (nearest-фильтрация) изображение получается зубчатым. Для устранения этого эффекта необходимо реализовать поддержку билинейной фильтрации Идея этого алгоритма представлена на изображении - интерполяция в двух направлениях, последовательно.
Далее представлен пример визуализации изображения без и с использованием билинейной фильтрации.
Исходное изображение необходимо разбить на 32 треугольника (равномерная сетка 4x4) и размещать в области рисования. Переключатель Filter определяет использовать ли билинейную фильтрацию. Пример использования билинейной фильтрации для исходного изображения показан на рисунке справа.
Растеризация треугольников должна производится построчно. Границы заливки определяютсяалгоритмом Брезенхема. При растеризации рекомендуется не хранить список пикселей, принадлежащих границе.
Анимация разбиения определяется двумя точками - начальное и конечное положение центров треугольников на траектории перемещения. Для каждого треугольника эти параметры различны. Вид кривой, описывающей траекторию, выбирается вами на этапе реализации. Конечное положение треугольника на траектории определяется случайно точкой в области изображения и случайным углом поворота. По кнопке Init все настройки сбрасываются и конечные положения пересчитываются. При первом запуске приложения все настройки задаются автоматически. Далее приводится пример траектории.
Если процесс анимации выключен, то текущее положение анимации регулируется слайдером. Слайдер является круговым (например, QDial) и задает положение на траектории. 0..180 - движение от начальной точки к конечной, 180..360 - движение обратно. Движение по часовой стрелке: 0 от 360 и при прохождение 360 цикл повторяется (от 0). Если процесс анимации запущен, то слайдер вращается сам, по таймеру. Привязка анимации только к прошедшему времени между тиками таймера. Анимация не должна моргать, но допускается неравномерная скорость анимации. Далее представлен пример крайних положений анимации (0 и 180). На изображении справа представлено удачное расположение разбиения в области рисования - рекомендуется придерживаться такой схемы (пустой центр и треугольники по краям)
Ваше приложение должно быть интерактивным - при наведении курсора мыши на любой треугольник выводить информацию в строке состояния (например, использовать QStatusBar). Обязательно отображать следующую информацию о текущем треугольнике: число пикселей его ребер, число непрозрачных пикселей и общее число пикселей треугольника.
Замечания
Основные требования к задачам сохраняются. Допускается уточнение условий задачи по электронной почте.
Эта задача на оценку и сдается лично. Приветствуется сдача задачи в рекомендуемые сроки.
Для проверки корректности работы алгоритмов можно использовать следующее изображение: