Дуга
Вычерчивание дуги выполняет метод Arc, инструкция вызова которого вобщем виде выглядит следующим образом:
1.Объект. Canvas .Arc (xl,yl,x2,y2, хЗ, уЗ,х4,у4)
где:
- xl, yl, х2, у2 — параметры, определяющие эллипс (окружность), частью которого является вычерчиваемая дуга;
- хЗ, уз — параметры, определяющие начальную точку дуги;
- х4, у4 — параметры, определяющие конечную точку дуги.
Начальная (конечная) точка — это точка пересечения границы эллипса и прямой, проведенной из центра эллипса в точку с координатами хЗ и уз (х4, у4). Дуга вычерчивается против часовой стрелки от начальной точки к конечной {рис. 10.7).
Цвет, толщина и стиль линии, которой вычерчивается дуга, определяются значениями свойства Реп поверхности (canvas), на которую выполняется вывод.
Рис. 1О.7. Значения параметров метода Arc определяют дугу как часть эллипса (окружности)

Прямоугольник
1.Объект.Canvas.Rectangle(xl,yl,х2,у2]
где:
- Объект — имя объекта (компонента), на поверхности которого выполняется вычерчивание;
- x1, y1 и y2, у2 — координаты левого верхнего и правого нижнего углов прямоугольника.
Метод RoundRec тоже вычерчивает прямоугольник, но со скругленными углами. Инструкция вызова метода RoundRec выглядит так:
1.Объект.Canvas.RoundRec(xl, yl, х2, у2, хЗ, уЗ)
где:
- x1, y1, х2, у2 — параметры, определяющие положение углов прямоугольника, в который вписывается прямоугольник со скругленными углами;
- хЗ и уЗ — размер эллипса, одна четверть которого используется для вычерчивания скругленного угла (рис. 10.8).
Рис. 10.8. Метод RoundRec вычерчивает прямоугольник со скругленными углами

Вид линии контура (цвет, ширина и стиль) определяется значениями свойства реп, а цвет и стиль заливки области внутри прямоугольника — значениями свойства Brush поверхности (canvas), на которой прямоугольник вычерчивается.
Есть еще два метода, которые вычерчивают прямоугольник, используя в качестве инструмента только кисть (Brush). Метод FiliRect вычерчивает закрашенный прямоугольник, а метод FrameRect — только контур. У каждого из этих методов лишь один параметр — структура типа TRect. Поля структуры TRect содержат координаты прямоугольной области, они могут быть заполнены при помощи функции Rect.
Ниже в качестве примера использования методов FillRect и FrameRect приведена процедура, которая на поверхности формы вычерчивает прямоугольник с красной заливкой и прямоугольник с зеленым контуром.
01.procedure TForm1.ButtonlClick(Sender: TObject);02.var03.rl, r2: TRect; // координаты углов прямоугольников04.begin05.// заполнение полей структура06.// зададим координаты углом прямоугольников07.rl := Rect(2C,20,60,40);08.r2 := Rect(10,10,40,50);09.with fоrml.Canvas do10.begin11.Brush.Color ;= clRed;12.FillRect(rl); // закрашенный прямоугольник13.Brush,Color := clGreen;14.FrameRect(r2); // только граница прямоугольнике15.end;16.end;
Многоугольник
Метод polygon вычерчивает многоугольник. В качестве параметра методполучает массив типа TPoint. Каждый элемент массива представляет собой запись, поля (х,у) которой содержат координаты одной вершины многоугольника. Метод Polygon вычерчивает многоугольник, последовательносоединяя прямыми линиями точки, координаты которых находятся в массиве; первую со второй, вторую с третьей, третью с четвертой и т. д. Затемсоединяются последняя и первая точки.
Цвет и стиль границы многоугольника определяются значениями свойстваРеп, а цвет и стиль заливки области, ограниченной линией границы, — значениями свойства Brush, причем область закрашивается с использованиемтекущего цвета и стиля кисти.
Ниже приведена процедура, которая, используя метод polygon, вычерчиваеттреугольник:
01.procedure TForml.Button2Click(Sender: TObject);02.var03.pol: array[1..3] of TPoint; // координаты точек треугольника04.begin05.pol[1].x :=10;06.pol[1] .y :=50;08.pol[2]-x := 40;09.pol[2].у := 10;10.pol[3].х := 70;11.pol[3].у : = 50;12.Forml.Canvas.Polygon(pol);13.end;
Сектор
Метод Pie вычерчивает сектор эллипса или круга. Инструкция вызова метода в общем виде выглядит следующим образом:
1.Объект.Canvas.Pie(xl,yl,x2,y2,x3,y3,x4,y4)
где:
- x1, y1, х2, у2 — параметры, определяющие эллипс (окружность), частью которого является сектор;
- хЗ, уЗ, х4, у4 — параметры, определяющие координаты конечных точек прямых, являющихся границами сектора.
Начальные точки прямых совпадают с центром эллипса (окружности). Сектор вырезается против часовой стрелки от прямой, заданной точкой с координатами (хЗ, уз), к прямой, заданной точкой с координатами (х4, у4) (рис. 10.9).
Рис. 1О.9. Значения параметров метода Pie определяют сектор как часть эллипса (окружности)

Точка
Поверхности, на которую программа может осуществлять вывод графики,соответствует объект canvas. Свойство Pixels, представляющее собой двумерный массив типа TColor, содержит информацию о цвете каждой точки графической поверхности. Используя свойство Pixels, можно задать требуемый цвет для любой точки графической поверхности, т. е. "нарисовать" точку.
Например, инструкция:
1.Form1.Canvas.Pixels[10,10]:=clRed
окрашивает точку поверхности формы в красный цвет.
Размерность массива Pixels определяется размером графической поверхности. Размер графической поверхности формы (рабочей области, которую также называют клиентской) задается значениями свойств clientwidth и clientHeight, а размер графической поверхности компонента image — значениями свойств width и Height. Левой верхней точке рабочей области формы соответствует элемент pixels [о, о], а правой нижней —Pixels[Clientwidth - 1,ClientHeight - 1].
Свойство Pixels можно использовать для построения графиков. График строится, как правило, на основе вычислений по формуле. Границы диапазона изменения аргумента функции являются исходными данными. Диапазон изменения значения функции может быть вычислен. На основании этих данных можно вычислить масштаб, позволяющий построить график таким образом, чтобы он занимал всю область формы, предназначенную для вывода графика.
Например, если некоторая функция f(x) может принимать значения от нуля до 1000, и для вывода ее графика используется область формы высотой в 250 пикселов, то масштаб оси у вычисляется по формуле: т = 250/1000. Таким образом, значению/(х) = 70 будет соответствовать точка с координатой Y= 233. Значение координаты вычислено по формуле
Y=h-f(x)x m = 250 - 70х(250/1000),
где h — высота области построения графика.
Обратите внимание на то, что точное значение выражения
250 - 70х(250/1000) равно 232,5.
Но т. к. индексом свойства Pixels, которое используется для вывода точки на поверхность canvas, может быть только целое значение, то число 232,5 округляется к ближайшему целому, которым является число 233.
Следующая программа, текст которой приведен в листинге 10.5, используя свойство Pixels, выводит график функции у = 2 sm(x) e^5. Для построения графика используется вся доступная область формы, причем если во время работы программы пользователь изменит размер окна, то график будет выведен заново с учетом реальных размеров окна.
Листинг 10.5. График функции
01.unit grfunc_;02.interface03.usea04.Windows, Messages, SysUtils, Classes, Graphics, Controls,05.Forms, Dialogs;06.TKorml = class(TForm)07.procedure FormPaint(Sender: TObject);08.procedure FormResize(Sender: TObject);09.private10.{ Private declarations }11.public12.I Public declarations I13.end;14.var15.Forrol: TForml;16.Implementation17.($R *.DFM}18.// Функция, график которой надо построить19.Function f [x:real):real;20.begin21.f:=2*Sin(x)*exp(x/5);22.end;23.// строит график функции24.procedure GrQfFunc;25.var26.xl,x2:real; // границы изменения аргумента функции27.yl,y2:real; // границы изменения значения функции28.xrreal; // аргумент функции29.у.real; // значение функции в точке х30.dx:real; // приращение аргумента31.l,b:integer; // леаый нижний угол области вывода графика32.w,h:integer; // ширина и высота области вывода графика33.mx,my:real; // масштаб по осям X и Y34.хО.уО: integer; // точка - начало координат35.begin36.// область вывода графика37.1:=10; // X - координата левого верхнего угла38.b:=Forml.ClientHeight-20; // Y — координата левого верхнего угла39.h:=Forml.ClientHeight-40; // высота40.w:=Fonnl.Width-40; // ширина41.xl:=0; // нижняя граница диапазона аргумента42.к2:-25: // верхняя граница диапазона аргумента43.dx:=0.01; // шаг аргумента44.// найдем максимальное и минимальное значения45.// функции на отрезке [xl,x2]46.yl:=f (xl) ; // /минимум47.y2:=f(xl); // максимум48.х : -xl ;49.repeat50.У :- f ( x ) ;51.if у < yl then yl:=y;52.if у > у2 then y2:=y;53.x:=x+dx;54.until (x >= х2) ;55.// вычислим масштаб56.myr=h/abs (y2-yl) ; // масштаб по оси Y57.mx:=w/abs(x2-xl) ; // масштаб по оси X58.жО:-1;59.yO:=b-Abs (Round (yl*my) ) ;60.with f orml . Canvas do61.begin62.// оси63.MoveToU,b) ;LineTo{l,b-h) ;64.MoveTo(xO.yO) ;LineTo(xO-(-w, yO) ;65.TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3) J ;66.TextOut (1+5, b, FloatToStrF(yl,ff General, 6,3) ) ;67.// построение графика68.x:=xl;69.repeat70.y:=f(x);71.Pixels[xO+Round(x*mx|,yO-Round(y*my)]:=clRed;72.x:=x+dx;73.until [x >= x2);74.end;75.end;76.procedure TForml.FormPaint(Sender; TObject);77.begin78.GrOfFunc;79.end;80.// изменился размер окна программы81.procedure TForml.FormResize(Sender: TObject);82.begin83.// очистить форму84.forml.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));85.// построить график86.GrOfFunc;87.end;88.end.
Основную работу выполняет процедура GrofFunc, которая сначала вычисляет максимальное (у2) и минимальное (y1) значения функции на отрезке [xl,x2]. Затем, используя информацию о ширине (Forml.ClientWidth -40) и высоте (Forml.ClientHeight - 4о) области вывода графика, вычисляет масштаб по осям X (тх) и У (ту).
Высота и ширина области вывода графика определяется размерами рабочей (клиентской) области формы, т. е. без учета области заголовка и границ. После вычисления масштаба процедура вычисляет координату Y горизонтальной оси (уО) и вычерчивает координатные оси графика. Затем выполняется непосредственное построение графика (рис. 10.10).
Вызов процедуры GrOfFunc выполняют процедуры обработки событий OnPaint и onFormResize. Процедура TForml.FormPaint обеспечивает вычерчивание графика после появления формы на экране в результате запуска программы, а также после появления формы во время работы программы, например, в результате удаления или перемещения других окон, полностью или частично перекрывающих окно программы. Процедура TForm1.FormResize обеспечивает вычерчивание графика после изменения размера формы.
Рис. 10.10. График, построенный процедурой GroffFunc

Приведенная программа довольно универсальна. Заменив инструкции в теле функции f ( х ) , можно получить график другой функции. Причем независимо от вида функции ее график будет занимать всю область, предназначенную для вывода.
