Преобразования в PyCairo [Урок №8]

В данном разделе мы рассмотрим преобразования. Аффинное преобразование состоит из нуля или более линейных преобразований (вращение, масштабирование или сдвиг) и смещений. Несколько линейных преобразований могут быть скомбинированы в простую матрицу. Вращение это преобразование, которое двигает твердое тело вокруг неподвижной точки. Масштабирование это трансформация, которая увеличивает или уменьшает объекты.

Коэффициент масштабирования одинаковый во всех направлениях. Перевод это преобразование, которое двигает каждую точку константного отрезка в определенном направлении. Сдвиг это трансформация, которая перемещает объект перпендикулярно к заданной оси, с большим значением на одной стороне оси, чем на другой.

Перевод

В данном примере мы продемонстрируем простое перевод.

В данном примере был нарисован прямоугольник, после этого мы выполним перевод для того, чтобы нарисовать такой же прямоугольник несколько раз.

Функция translate() меняет текущую матрицу преобразования путем смещения пользовательского пространства координат. В нашем случае мы выполнили перевод на 20 пунктов в обоих направлениях.

Преобразования в PyCairo [Урок №8]

Сдвиг

В следующем примере мы выполним операцию сдвига. Сдвиг – это искажение объекта вдоль определенной оси. В PyCairo нет определенного метода для этой операции. Нам нужно создать собственную матрицу преобразования. Обратите внимание на то, что каждое аффинное преобразование может быть выполнено путем создания матрицы преобразования.

На примере данного кода, мы выполняем простую операцию сдвига.

Данное преобразование смещает значение у на 0.5 пунктов значения х.

Мы выполняем данное преобразование при помощи метода transform() .

Преобразования в PyCairo [Урок №8]

Масштабирование

В данном примере мы продемонстрируем операцию масштабирования. Масштабирования – это операция преобразования, в которой объект увеличивается или сжимается в размерах.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Мы нарисуем три прямоугольника размером 90 на 90 пикселей, на двух из них мы выполним операцию масштабирования.

Мы равномерно масштабируем прямоугольник с коэффициентом 0.6

Здесь мы выполним другую операцию масштабирования с коэффициентом 0.8. Если мы взглянем на изображение, мы можем увидеть что третий, желтый треугольник является самым маленьким. Даже если бы мы использовали наименьший коэффициент масштабирования. Так происходит по той причине, что операции преобразования являются аддитивными. На самом деле, масштабирование третьего прямоугольника было выполнено с коэффициентом 0.528 (0.6х0.8).

Преобразования в PyCairo [Урок №8]

Разделительные преобразования

Разделительные преобразования являются аддитивные. Для того, чтобы разделить одну операцию от другой, мы воспользуемся методом save()  и restore(). Метод save() создает копию текущего состояния контекста рисования и сохраняет его во внутреннем стеке сохраненных состояний.

В данном примере мы масштабируем два прямоугольника. На этот раз мы разделим операции масштабирования друг от друга.

Мы разделили операцию масштабирования с применением метода scale() между нашими методами save()  и restore().

Преобразования в PyCairo [Урок №8]
Теперь третий, желтый прямоугольник стал больше чем второй, красный.

Пончик

В данном примере мы создадим комплексную фигуру, состоящую из множества Python вращающихся эллипсов.

Мы выполним операции вращения и масштабирования. Мы также будем сохранять, и восстанавливать контексты PyCairo.

Мы создаем окружность посреди окна GTK. Это будет ограничивающая окружность для наших эллипсов.

Мы создадим 36 эллипсов вдоль всей нашей окружности, а также разделим каждую операцию масштабирования и вращения друг от друга при помощи методов save()  и restore()

Преобразования в PyCairo [Урок №8]

Звезда

В следующем примере мы покажем вращающуюся и масштабируемую звезду.

В данном примере мы создали звезду и выполним над ней все упомянутые преобразования.

Звезда будет стоять на этих точках.

В методе init_vars()  мы инициализируем три переменные. Переменная self.angle используется при вращении, self.scale при масштабировании звезды. Переменная self.delta контролирует, когда звезда будет расширяться и когда сокращаться.

Указывается каждая миллисекунда cv.SPEED  метода on_timer() .

Эти линии контролируют моменты, после которых звезда начнет расширяется или сжимается.

Мы смещаем звезду в центр окна, вращаем и масштабируем её.

Здесь мы нарисовали звезду.

Преобразования в PyCairo [Урок №8]