Разработка Gui на Qt (PySide6) - Фракталы
Задание A
Видео
Пример на Python
Пример на C++
Создайте приложение, которое отрисовывает кривую Коха порядка \(N\), начиная с \(N=0\). Кривая должна «смотреть вверх». Количество итераций меняется при помощи QSpinBox.
Кривая Коха отрисовывается внутри специального виджета в методе paintEvent. Виджет имеет слот, обновляющий значение числа итераций. Этот слот должен изменить значение поля класса, хранящего число итераций, затем вызвать у виджета метод repaint() для обновления содержимого. Сигнал valueChanged у QSpinBox, меняющего число итераций, соединяется с данным слотом виджета.
Кривая Коха должна отрисовываться методом paintEvent. Этот метод должен вызывать рекурсивную функцию, рисующую кривую Коха по заданному числу итераций и концам кривой. Концы кривой должны быть действительными числами, так отрисовка будет лучше. Также в эту функцию нужно передавать QPainter.
Для определения размеров виджета внутри метода paintEvent нужно использовать методы width() и height()
Задание B
Видео
Пример "ручной" компоновки обработкой resizeEvent на Python – не для использования, только для знакомства
Пример использования менеджеров компоновки на Python
Пример "ручной" компоновки обработкой resizeEvent на C++ – не для использования, только для знакомства
Пример использования менеджеров компоновки на C++
Документация на QBoxLayout – базовый класс для QHBoxLayout и QVBoxLayout
Окно приложения должно содержать SpinBox, управляющий количеством итераций кривой Коха. Размеры кривой Коха должны меняться при изменении размеров окна. Сама кривая Коха должна быть максимального размера, допустимого для данного размера окна и располагаться в центре окна.
Для изменения размеров виджета используется менеджер компоновки, метод paintEvent виджета должен определять собственные размеры при помощи вызова методов width() и height() и использовать данные размеры для рисования фрактала.
Изменение размеров кривой Коха должно быть "гладким", то есть при изменениях размера окна не должно быть "прыжков" кривой.
Задание C
Разные фракталы
Реализовать приложение, рисующее минимум три из перечисленных фракталов (один – кривая Коха, должно быть ещё два других, можно использовать примеры выше или иные фракталы). Функционал приложения:
а) выбор типа фрактала при помощи элемента управления типа меню, QRadioButton или QComboBox.
б) выбор глубины рекурсии фрактала при помощи SpinBox.
в) автоматическое масштабирование фрактала при изменении размеров окна приложения, как в предыдущем задании, с гладкой склейкой.
Задание D
Видео
Пример на Python
Пример на C++
Функционал приложения: масштабирование фрактала при помощи колеса мыши, перемещение фрактала внутри окна при помощи мыши, изменение фрактала при изменении размеров окна.
Требования к масштабированию фрактала.
- Все три операции (перемещение фрактала мышью, изменение масштаба про помощи колеса, изменение размеров окна должны происходить “гладко”, то есть не должно быть резких скачков изображения при последовательных применений разных операций).
- Масштаб изображения меняется только при движении колесом мышью. При изменении размеров окна масштаб фрактала не меняется.
- При движении колеса мыши масштаб меняется таким образом, что точка, расположенная в центре окна, остается неподвижной (вариант, который тоже принимается, но более сложный в реализации: неподвижной остается точка, на которую указывает мышь).
- При изменении размеров окна масштаб не меняется, а изображение перемещается таким образом, чтобы точка, которая была в центре окна, продолжала оставаться в центре окна.