Читайте также:
|
|
Следующая программа, текст которой приведен в листинге 10.5, используя свойство pixels, выводит график функции у = 2 sin(x) ex/5. Для построения графика используется вся доступная область формы, причем если во время работы программы пользователь изменит размер окна, то график будет выведен заново с учетом реальных размеров окна.
Листинг 10.5. График функции
unit grfunc_;
Interface
uses Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
Type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;
var Form1: TForm1;
Implementation
{$R *.DFM}
// Функция, график которой надо построить
Function f(x:real):real;
Begin
f:=2*Sin(x)*exp(x/5);
end;
// строим график функции
procedure GrOfFunc;
Var
x1,x2:real; // границы изменения аргумента функции
y1,y2:real; // границы изменения значения функции
х:real; // аргумент функции
у:real; // значение функции в точке х
dx:real; // приращение аргумента
l,b:integer; // левый нижний угол области вывода графика
w,h:integer; // ширина и высота области вывода графика
mx,my:real; // масштаб по осям X и Y
х0,у0:integer; // точка — начало координат
Begin
// область вывода графика
l:=10; // X — координата левого верхнего угла
b:=Form1.ClientHeight-20; //У — координата левого верхнего угла
h:=Form1.ClientHeight-40; // высота
w:=Form1.Width-40; // ширина
x1:=0; // нижняя граница диапазона аргумента
х2:=25; // верхняя граница диапазона аргумента
dx:=0.01; // шаг аргумента
// найдем максимальное и минимальное значения
// функции на отрезке [x1,x2]
y1:=f(x1); // минимум
y2:=f(x1); //максимум
x:=x1;
Repeat
У:= f (х);
if у < y1 then y1:=y;
if у > у2 then y2:=y;
х:=x+dx;
until (x >= х2);
// вычислим масштаб
my:=h/abs(y2-y1); // масштаб по оси Y
mx:=w/abs(x2-x1); // масштаб по оси X
х0:=1;
у0:=b-Abs(Round(y1*my));
Withform1.Canvas do
Begin
// оси
MoveTo(l,b);LineTo(l,b-h);
MoveTo(x0,y0);LineTo(x0+w,y0);
TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));{универсальный формат}
TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));
// построение графика
x:=x1;
Repeat
y:=f(x);
Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;
x:=x+dx;
until (x >= x2);
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin GrOfFunc; end;
// изменился размер окна программы
procedure TForm1.FormResize(Sender: TObject);
Begin
// очистить форму
form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
// построить график
GrOfFunc;
end;
End.
Основную работу выполняет процедура GrOfFunc, которая сначала вычисляет максимальное (у2) и минимальное (yl) значения функции на отрезке [x1,x2]. Затем, используя информацию о ширине (Forml.Clientwidth -40) и высоте (Form1.ClientHeight - 40) области вывода графика, вычисляет масштаб по осям X (mх) иY(mу).
Высота и ширина области вывода графика определяется размерами рабочей (клиентской) области формы, т. е. без учета области заголовка и границ. После вычисления масштаба процедура вычисляет координату у горизонтальной оси (уо) и вычерчивает координатные оси графика. Затем выполняется непосредственное построение графика (рис. 10.10).
Вызов процедуры GrOfFunc выполняют процедуры обработки событий onPaint и onFormResize. Процедура TForm1. FormPaint обеспечивает вычерчивание графика после появления формы на экране в результате запуска программы, а также после появления формы во время работы программы, например, в результате удаления или перемещения других окон, полностью или частично перекрывающих окно программы. Процедура TForm1.FormResize обеспечивает вычерчивание графика после изменения размера формы.
Рис. 10.10. График, построенный процедурой GrOfFunc
Приведенная программа довольно универсальна. Заменив инструкции в теле функции f (х), можно получить график другой функции. Причем независимо от вида функции ее график будет занимать всю область, предназначенную для вывода.
Дата добавления: 2015-02-16; просмотров: 90 | Поможем написать вашу работу | Нарушение авторских прав |