Базовое рисование в PyCairo [Урок №3]

автор

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

Линии

Линия является базовым векторным объектом. Для того, чтобы нарисовать линию, мы применим два метода. Начало линии определяется методом move_to() . Конец линии определяется методом line_to() .

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

Документация GTK указывает на то, что левая кнопка мыши у нас находится под номером 1, правая кнопка мыши под номером 3. Мы создадим собственный класс, чтобы обозначить клавиши мыши собственными идентификаторами.

Некоторые действия не указаны по умолчанию, это касается и действий, вызванных нажатием мыши. Нам нужно указать действия, вызванные нажатием мыши при помощи метода the set_event() .

При помощи данного кода, мы получаем реакцию на действия, вызванные нажатием мыши.

Линии написаны черным цветом с толщиной 0.5 точки.

Мы связываем каждую точку в списке со всеми остальными. Метод stroke() рисует указанную линию.

В конце все координаты удаляются, и мы можем приступить к новому объекту.

При нажатии левой клавиши мыши, мы добавляем координаты х и у в список self.coords .

При нажатии правой кнопкой мыши, мы вызываем метод queue_draw() , который перерисовывает область рисования. Все точки теперь соединены с линиями.

Заливка и Контуры

Операция мазков рисует контуры фигуры, а операция заливки заполняет пространство фигуры.

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

Данный модуль нужен для константы pi , которая применяется при рисовании круга.

Мы указываем ширину линии при помощи метода set_line_width() . При помощи метода set_source_rgb()  мы применяем, в данном случае, темно-красный цвет.

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

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

Мы меняем цвет рисунка и выполняем заливку круга новым цветом при помощи метода fill()  .

Пунктирные линии

Каждая линия может быть нарисована с различными пунктирными прочерками. Пунктир определяет стиль линии. Шаблон пунктира применяется при помощи модуля set_dash() . Шаблон задается списком тире, список является набором «плавающих» вариантов пунктира. С их помощью отображаются, либо же скрываются части шаблона пунктира.

Тот или иной пунктир указывается методом stroke() для создания линии. Если количество пунктирных линий указано как 0, то пунктирование отключается и линия будет сплошной. Если количество пунктирных линий указано как 1, то шаблон применяется с симметричным чередованием частей размера, в соответствии с указанным размером пунктирной линии.

Мы рисуем три линии с тремя разными пунктирами.

У нас есть шаблоны из трех чисел. С начала линии 4 точки отображаются, следующие 21 не отображаются, следующие 2 отображаются, затем следующие 4 точки не отображаются, следующие 21 точка отображается и следующие 2 точки не отображаются. Данный шаблон применяется от начала и до конца линии.

В данном шаблоне 14 точек отображаются, затем следующие 6 точек не отображаются

Мы создали симметричный шаблон пунктирной линии с чередующимися отображаемыми и не отображаемыми точками.

Окончания линий

Окончания линий означают конечную точку нашей линии.

  1. cairo.LINE_CAP_BUTT
  2. cairo.LINE_CAP_ROUND
  3. cairo.LINE_CAP_SQUARE

В Cairo существует три разных окончания линий с разными стилями.

Линия с окончанием cairo.LINE_CAP_SQUARE имеет отличный от cairo.LINE_CAP_BUTT  размер. Если линия имеет ширину х единиц, линия с окончанием cairo.LINE_CAP_SQUARE  будет иметь ширину х\2 в начале и конце.

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

Толщина наших линий будет 12 единиц. Ширина линии по умолчанию – 2 единицы.

Мы нарисовали горизонтальную линию с окончанием cairo.LINE_CAP_ROUND .

Одна из трех вертикальных линий используется для демонстрации разниц в размерах.

Изгибы линий

Линии могут пересекаться в трех различных стилях.

  1. cairo.LINE_JOIN_MITER
  2. cairo.LINE_JOIN_BEVEL
  3. cairo.LINE_JOIN_ROUND

В данном примере мы нарисуем три толстых прямоугольника с различными изгибами линий

Толщина линий 14 единиц.

Мы нарисовали прямоугольник со стилем изгиба линий cairo.LINE_JOIN_MITER.

Кривая Безье

Кривая Безье представлена в виде кривых линий, которые указаны в соответствии с определенными математическими формулами. Математический метод расчет кривых был разработан французским математиком Пьером Безье в конце 1960-х для производства автомобилей Рено.

Метод curve_to()  добавляет кубический сплайн в указанный путь. Параметры координат х и у первой контрольной точки, координаты х и у для второй контрольной точки и координаты х и у в конце кривой.

В данном примере кривая Безье написана с применением метода curve_to().

Вам может быть интересно

Scroll Up