Как сделать дугу в канве
Перейти к содержимому

Как сделать дугу в канве

  • автор:

Описание методов канвы

procedure Arc(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); Метод Arc рисует дугу окружности или эллипса с помощью текущих параметров пера Pen. Точки (X1, Y1) и (X2, Y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X3, Y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X4, Y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. В Windows 95 суммы X1 + X2, Y1 + Y2 и X1 + X2 + Y1 + Y2 не должны превышать 32768. В Windows NT направление рисования можно изменить на направление по часовой стрелке вызовом функции SetArcDirection. p Рис.3. Линии, фигуры и текст, вычерченные методами канвы rocedure Chord(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer); Метод Chord рисует замкнутую фигуру: дугу окружности или эллипса, замкнутую хордой, с помощью текущих параметров пера Pen. Фигура заполняется текущим значением Brush. Точки (X1, Y1) и (X2, Y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X3, Y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X4, Y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Хорда соединяет точки (X3, Y3) и (X4, Y4) . В Windows 95 суммы X1 + X2, Y1 + Y2 и X1 + X2 + Y1 + Y2 не должны превышать 32768. В Windows NT направление рисования дуги можно изменить на направление по часовой стрелке вызовом функции SetArcDirection. procedure Ellipse(X1, Y1, X2, Y2: Integer); Метод Ellipse рисует окружность или эллипс с помощью текущих параметров пера Pen. Фигура заполняется текущим значением Brush. Точки (X1, Y1) и (X2, Y2) определяют прямоугольник, описывающий эллипс. В Windows 95 суммы X1 + X2, Y1 + Y2 и X1 + X2 + Y1 + Y2 не должны превышать 32768. procedure Pie(X1, Y1, X2, Y2, X3, Y3, X4, Y4: Longint); Метод Pie рисует замкнутую фигуру — сектор окружности или эллипса, с помощью текущих параметров пера Pen. Фигура заполняется текущим значением Brush. Точки (X1, Y1) и (X2, Y2) определяют прямоугольник, описывающий эллипс. Начальная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X3, Y3). Конечная точка дуги определяется пересечением эллипса с прямой, проходящей через его центр и точку (X4, Y4). Дуга рисуется против часовой стрелки от начальной до конечной точки. Рисуются прямые, ограничивающие сегмент и проходящие через центр эллипса и точки (X3, Y3) и (X4, Y4). В Windows 95 суммы X1 + X2, Y1 + Y2 и X1 + X2 + Y1 + Y2 не должны превышать 32768. В Windows NT направление рисования дуги можно изменить на направление по часовой стрелке вызовом функции SetArcDirection. procedure Polygon(Points: array of TPoint); Метод Polygon рисует на канве замкнутую фигуру (полигон, многоугольник) по множеству угловых точек, заданному массивом Points. Первая из указанных точек соединяется прямой с последней. Этим метод Polygon отличается от метода Polyline, который не замыкает конечные точки. Рисование проводится текущим пером Pen. Внутренняя область фигуры закрашивается текущей кистью Brush. Метод позволяет рисовать фигуру по точкам, хранящимся в массиве элементов типа TPoint. Если желательно использовать для рисования только часть точек массива, это можно сделать с помощью функции Slice. Если надо нарисовать полигон всего по нескольким точкам, то передавать их в метод Polygon удобно с помощью стандартнойфункции Point. function Point(AX, AY: Integer): TPoint; Функция Point cоздает структуру TPoint из пары координат, являющихся ее параметрами. Функцию удобно использовать для задания аргументов многих функций, имеющих параметры типа TPoint. type TPoint = record X: Longint; Y: Longint; end; Тип TPoint используется для многих свойств и обычно определяет экранные координаты левого верхнего угла прямоугольной области. X определяет горизонтальную координату, а Y — вертикальную. procedure Polyline(Points: array of TPoint); Метод Polyline рисует на канве кусочно-линейную кривую по множеству точек, заданному массивом Points. Отличие метод Polyline от метода Polygon заключается в том, что метод Polygon замыкает конечные точки, а метод Polyline — нет. Рисование проводится текущим пером Pen. Метод не изменяет текущей позиции PenPos пера Pen. Метод позволяет рисовать кусочно-линейный график функции, хранящийся в массиве элементов типа TPoint. Если желательно использовать для рисования только часть точек массива, это можно сделать с помощью функции Slice. Если надо нарисовать кривую всего по нескольким точкам, то передавать их в метод Polyline удобно с помощью функции Point. То, что делает метод Polyline, можно сделать и с помощью методов MoveTo и LineTo, подведя сначала перо к первой точке а затем последовательно выполняя LineTo. Различие будет заключаться в том, что метод Polyline не изменит текущую позицию пера, а методы MoveTo и LineTo изменят. procedure MoveTo(X, Y: Integer); Метод MoveTo изменяет текущую позицию пера PenPos на заданную точкой (X, Y). Это эквивалентно непосредственной установке свойства PenPos. При перемещении пера методом MoveTo ничего не рисуется. procedure LineTo(X, Y: Integer); Метод LineTo рисует на канве прямую линию, начинающуюся с текущей позиции пера PenPos и кончающуюся точкой (X, Y), исключая саму точку (X, Y). Текущая позиция пера PenPos перемещается в точку (X, Y). При рисовании используются текущие установки пера Pen. procedure Rectangle(X1, Y1, X2, Y2: Integer); Метод Rectangle рисует на канве текущим пером Pen прямоугольник, верхний левый угол которого имеет координаты (X1, Y1), а нижний правый — (X2, Y2). Прямоугольник закрашивается текущей кистью Brush. Рисование прямоугольника без рамки можно осуществить методом FillRect. Прямоугольник со скругленными углами рисуется методом RoundRect. Прямоугольник без внутренней закраски рисуется методом FrameRect. procedure RoundRect(X1, Y1, X2, Y2, X3, Y3: Integer); Метод RoundRect рисует на канве прямоугольную рамку со скругленными углами, используя текущие установки пера Pen и закрашивая площадь фигуры текущей кистью Brush. Рамка определяется прямоугольником с координатами углов (X1,Y1) и (X2,Y2). Углы скругляются с помощью эллипсов с шириной X3 и высотой Y3. Если задать ширину эллипса X3 равной X2 — X1, то верхняя и нижняя границы рамки окажутся целиком скругленными (без прямолинейной части). Если высотаY3 равна Y2 — Y1, то же самое произойдет с левой и правой границами рамки. Если же оба измерения эллипса не меньше размеров рамки, то будет рисоваться просто эллипс. Но, конечно, для рисования эллипса лучше использовать метод Ellipse. Если один из размеров эллипса задать нулевым, то будет рисоваться прямоугольная рамка. Но, конечно, для такой рамки лучше использовать метод Rectangle. procedure FillRect(const Rect: TRect); Метод FillRect заполняет прямоугольник канвы, указанный параметром Rect, используя текущее значение Brush. Заполняемая область включает верхнюю и левую стороны прямоугольника, но не включает правую и нижнюю стороны. При использовании FillRect параметр Rect часто задается стандартной функцией Rect. function Rect(ALeft, ATop, ARight, ABottom: Integer): TRect; Вызов функции Rect позволяет создать структуру типа TRect, описывающую прямоугольную область с координатами ALeft — левый край, ATop — верх, ARight — правый край, ABottom — низ. Функция применяется для задания значений параметрам и свойствам типа TRect. type TRect = record case Integer of 0: (Left, Top, Right, Bottom: Integer); 1: (TopLeft, BottomRight: TPoint); end; procedure FloodFill(X, Y: Integer; Color: TColor; FillStyle: TFillStyle); type TFillStyle = (fsSurface, fsBorder); Метод FloodFill закрашивает текущей кистью Brush замкнутую область канвы, определенную цветом и начальной точкой закрашивания (X, Y). Точка с координатами X и Y является произвольной внутренней точкой заполняемой области, которая может иметь произвольную форму. Граница этой области определяется сочетанием параметров Color и FillStyle. Параметр Color указывает цвет, который используется при определении границы закрашиваемой области, а параметр FillStyle определяет, как именно по этому цвету определяется граница. Если FillStyle = fsSurface, то заполняется область, окрашенная цветом Color, а на других цветах метод останавливается. Если FillStyle = fsBorder, то наоборот, заполняется область окрашенная любыми цветами, не равными Color, а на цвете Color метод останавливается. procedure FrameRect(const Rect: TRect); Метод FrameRect рисует на канве прямоугольную рамку вокруг области Rect, используя установку текущей кисти Brush. Толщина рамки — 1 пиксель. Область внутри рамки кистью не заполняется. Отличается от метода Rectangle тем, что рамка рисуется цветом кисти (в методе Rectangle — цветом пера Pen) и область не закрашивается (в методе Rectangle закрашивается). procedure TextOut(X, Y: Integer; const Text: string); Метод TextOut пишет строку текста Text на канве, начиная с позиции с координатами (X, Y). Надпись делается в соответствии с текущими установками шрифта Font. Фон надписи определяется установками текущей кисти. Текущая позиция PenPos пера Pen перемещается к концу выведенного текста. Для выравнивания позиции текста на канве можно использовать методы, дающие перед выводом высоту и длину текста в пикселях: методы TextExtent, TextHeight и TextWidth. Если цвет кисти в момент вывода текста отличается от того, которым закрашена канва, то текст получится выведенным в цветной прямоугольной рамке. Но ее размеры будут точно равны размерам надписи. Если требуется более красивая рамка с отступом от текста или если надо ограничить выводимый текст размерами определенной рамки, следует применять метод TextRect. procedure TextRect(Rect:TRect; X,Y:Integer; const Text:string); Метод TextRect пишет строку текста Text на канве, начиная с позиции с координатами (X, Y) — это левый верхний угол надписи. Часть текста, не помещающаяся в прямоугольную область Rect, усекается. Надпись делается в соответствии с текущими установками шрифта Font. Пространство внутри области Rect закрашивается текущей кистью Brush. Для выравнивания позиции текста внутри области на канве можно использовать методы, дающие перед выводом высоту и длину текста в пикселях: методы TextExtent, TextHeight и TextWidth.

16.04.2013 27.65 Кб 33 Compilers_methodics.doc

16.04.2013 39.3 Кб 24 delphi.reg

16.04.2013 1.47 Mб 38 ВМИПЛаб1.doc

16.04.2013 189.91 Кб 31 ВМИПЛаб2.rtf

16.04.2013 112.29 Кб 35 ВМИПЛаб3.rtf

16.04.2013 1.46 Mб 40 ВМИПЛаб4.doc

16.04.2013 220.66 Кб 30 ВМИПЛаб5.rtf

16.04.2013 87.04 Кб 30 ВМИПЛаб6.doc

16.04.2013 70.66 Кб 31 ВМИПЛаб7.doc

16.04.2013 390.66 Кб 32 ВМИПЛаб8.doc

16.04.2013 23.04 Кб 32 ЭкзаменВМИП.doc

Ограничение

Для продолжения скачивания необходимо пройти капчу:

Как сделать дугу в канве

Регистрация: 25.10.2009

Сообщений: 92

Дуга Canvas.Arc

Надо на канве нарисовать дугу окружности, для которой известны 2 ее конца (координаты) и радиус, плюс еще указано направление поворота дуги (по или против часовой стрелки) и угол (не значение угла, а только > 180 градусов или меньше). Допустим так:

x1, y1, x2, y2, r: integer; dir, ang: boolean;

Есть в Делфи функция

procedure Arc(X1,Y1,X2,Y2,X3,Y3,X4,Y4: double);

первые 2 точки здесь определяют прямоугольник, в который вписывается эллипс, вторые две точки — при соединении их с центром эллипса получаются две прямые, которые пересекают эллипс в граничных точках дуги (дуга чертится против часовой стрелки). Пытаюсь тупо найти центр по исходным данным (выразить), с помощью уравнения окружности, получается лажа, ибо квадратное уравнение. Может что-то не так делаю, или есть какой-то более простой способ построения дуги по указанным исходным данным?

Последний раз редактировалось cw_o; 11.12.2009 в 20:17 .

Canvas. Рисуем окружность и дугу

Canvas. Рисуем окружность и дугу

Давайте разберемся как рисуется примитив дуга и ее производная — окружность.

Дуга рисуется следующей командой:

arc ( x , y , radius , startAngle , endAngle , anticlockwise ) ;

Давайте рассмотрим аргументы данной функции:

  • x, y — координаты центра, вокруг которого будет рисоваться окружность.
  • radius — радиус окружности, безразмерная величина.
  • startAngle — начальный угол, начало отсчета. Задается в радианах. Счет идет по часовой стрелке с правой части окружности. На рисунке начало отсчета показано «0».
  • endAngle — конечный угол. В радианах. Так, полной окружности соответствует угол 2pi.
  • anticlockwise — направление рисования. По-умолчанию рисуем против часовой стрелки, значение true. Если мы хотим рисовать по часовой стрелке — false.

Углы при работе в canvas измеряются в радианах. Углу 90° соотвествует значение Pi/2, углу 180° — Pi, а полной окружности — 2*Pi. Для получения числа Pi можно воспользоваться функцией Math.PI.

Для удобства, на рисунке приведено вычисленное значение числа Pi.

Как рисовать линии в canvas читайте в предыдущем уроке.

Выполнить

Задание 1. Нарисуйте дугу от 0° до 270°.Выполните рисование по часовой и против часовой стрелки.

Задание 2. Разработайте интерфейс, в котором пользователь может задать радиус дуги, начальный и конечный угол, с помощью checkbox задается направление рисования и дополнительный checkbox определяет залита ли фигура или нет. Скрипт должен на основе вводимых данных строить дугу.

Задание 3. Анимируйте процесс рисования фигуры.

Canvas

В tkinter от класса Canvas создаются объекты-холсты, на которых можно «рисовать», размещая различные фигуры и объекты. Делается это с помощью вызовов соответствующих методов.

При создании экземпляра Canvas необходимо указать его ширину и высоту. При размещении геометрических примитивов и других объектов указываются их координаты на холсте. Точкой отсчета является верхний левый угол.

Координатная ось

В программе ниже создается холст. На нем с помощью метода create_line рисуются отрезки. Сначала указываются координаты начала (x1, y1) , затем – конца (x2, y2) .

from tkinter import * root = Tk() c = Canvas(width=200, height=200, bg='white') c.pack() c.create_line(10, 10, 190, 50) c.create_line(100, 180, 100, 60, fill='green', width=5, arrow=LAST, dash=(10, 2), activefill='lightgreen', arrowshape=(10, 20, 10)) root.mainloop()

Метод create_line

Остальные свойства являются необязательными. Так activefill определяет цвет отрезка при наведении на него курсора мыши.

Создание прямоугольников методом create_rectangle :

… c.create_rectangle(10, 10, 190, 60) c.create_rectangle(60, 80, 140, 190, fill='yellow', outline='green', width=3, activedash=(5, 4))

Метод create_rectangle

Первые координаты – верхний левый угол, вторые – правый нижний. В приведенном примере, когда на второй прямоугольник попадает курсор мыши, его рамка становится пунктирной, что определяется свойством activedash .

Методом create_polygon рисуется произвольный многоугольник путем задания координат каждой его точки:

… c.create_polygon(100, 10, 20, 90, 180, 90) c.create_polygon(40, 110, 160, 110, 190, 180, 10, 180, fill='orange', outline='black')

Метод create_polygon

Для удобства координаты точек можно заключать в скобки:

… c.create_polygon((40, 110), (160, 110), (190, 180), (10, 180), fill='orange', outline='black')

Метод create_oval создает эллипсы. При этом задаются координаты гипотетического прямоугольника, описывающего эллипс. Если нужно получить круг, то соответственно описываемый прямоугольник должен быть квадратом.

… c.create_oval(50, 10, 150, 110, width=2) c.create_oval(10, 120, 190, 190, fill='grey70', outline='white')

Метод create_oval

Более сложные для понимания фигуры получаются при использовании метода create_arc . В зависимости от значения опции style можно получить сектор (по умолчанию), сегмент ( CHORD ) или дугу ( ARC ). Также как в случае create_oval координаты задают прямоугольник, в который вписана окружность (или эллипс), из которой «вырезают» сектор, сегмент или дугу. Опции start присваивается градус начала фигуры, extent определяет угол поворота.

… c.create_oval(10, 10, 190, 190, fill='lightgrey', outline='white') c.create_arc(10, 10, 190, 190, start=0, extent=45, fill='red') c.create_arc(10, 10, 190, 190, start=180, extent=25, fill='orange') c.create_arc(10, 10, 190, 190, start=240, extent=100, style=CHORD, fill='green') c.create_arc(10, 10, 190, 190, start=160, extent=-70, style=ARC, outline='darkblue', width=5)

Метод create_arc

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

На холсте можно разместить текст. Делается это с помощью метода create_text :

… c.create_text(100, 100, text="Hello World,\nPython\nand Tk", justify=CENTER, font="Verdana 14") c.create_text(200, 200, text="About this", anchor=SE, fill="grey")

Метод create_text

По умолчанию в заданной координате располагается центр текстовой надписи. Чтобы изменить это и, например, разместить по указанной координате левую границу текста, используется якорь со значением W (от англ. west – запад). Другие значения: N , NE , E , SE , S , SW , W , NW . Если букв, задающих сторону привязки, две, то вторая определяет вертикальную привязку (вверх или вниз «уйдет» текст от заданной координаты). Свойство justify определяет лишь выравнивание текста относительно себя самого.

Практическая работа

Создайте на холсте подобное изображение:

Создание изображения на холсте в Tkinter

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

Курс с примерами решений практических работ: pdf-версия

X Скрыть Наверх

Tkinter. Программирование GUI на Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *