unitgrfunc_;
Interface
usesWindows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
Type
TForm1 = class(TForm)
procedureFormPaint(Sender: TObject);
procedureFormResize(Sender: TObject);
private{ Private declarations }
public{Public declarations }
end;
varForm1: TForm1;
Implementation
{$R *.DFM}
// Функция, график которой надо построить
Functionf(x:real):real;
Begin
f:=2*Sin(x)*exp(x/5) ;
end;
// строим график функции
procedureGrOfFunc;
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у < y1theny1:=y;
ifу > у2theny2:=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;
procedureTForm1.FormPaint(Sender: TObject);
beginGrOfFunc; end;
// изменился размер окна программы
procedureTForm1.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
Примечание
Рассмотренная программа работает корректно, если функция, график которой надо построить, принимает как положительные, так и отрицательные значения. Если функция во всем диапазоне только положительная или только отрицательная, то в программу следует внести изменения.
Программа вывода графика любой функции, используя компоненту Image
unit Unit1;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, ExtCtrls;
Type
TForm1 = class(TForm)
Image1: TImage;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N1Click(Sender: TObject);
private { Private declarations }
public { Public declarations }
end;
Var
Form1: TForm1;
Implementation
{$R *. dfm}
function www(x:real):real ;
Begin
result:=x*x-3*x+2;
end;
procedure TForm1.Button1Click(Sender: TObject);
varx,y:real; i:integer;
Begin
if Edit1.Text<> '' then
Begin
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,501,501);
Image1.Canvas.MoveTo(0,251);
Image1.Canvas.LineTo(501,251);
Image1.Canvas.MoveTo(251,0);
Image1.Canvas.LineTo(251,501);
Image1.Canvas.MoveTo(241,20);
Image1.Canvas.LineTo(251,0);
Image1.Canvas.LineTo(261,20);
Image1.Canvas.MoveTo(481,241);
Image1.Canvas.LineTo(501,251);
Image1.Canvas.LineTo(481,261);
for i:=1 to 21 do begin
Image1.Canvas.MoveTo(i*25+1,246);
Image1.Canvas.LineTo(i*25+1,254);
Image1.Canvas.TextOut(i*25+1,255,FloatToStr(StrToInt(edit1.Text)/250*(i*25-250)));
Image1.Canvas.MoveTo(246,i*25+1);
Image1.Canvas.LineTo(254,i*25+1);
Image1.Canvas.TextOut(255,i*25+1,FloatToStr(- StrToInt(edit1.Text)/250*(i*25-250)));
end;
Image1.Canvas.TextOut(240,10,'y');
Image1.Canvas.TextOut(480,230,'x');
x:=StrToInt(edit1.Text)/250*(-250);
y:=www(x);
Image1.Canvas.MoveTo(round(X/Strtoint(Edit1.Text)*250+251),
round(-Y/StrToInt(Edit1.Text)*250+251));
fori:=2 to 501 do begin
x:=StrToInt(edit1.Text)/250*(i-251);
y:=www(x);
Image1.Canvas.LineTo(round(X/Strtoint(Edit1.Text)*250+251),
round(- Y/StrToInt(Edit1.Text)*250+251)); end
End
else ShowMessage('введите масштаб');
end;
procedure TForm1.FormCreate(Sender: TObject);
Begin
Image1.Canvas.Brush.Color:=clWhite;
Image1.Canvas.Rectangle(0,0,501,501);
Image1.Canvas.MoveTo(0,251);
Image1.Canvas.LineTo(501,251);
Image1.Canvas.MoveTo(251,0);
Image1.Canvas.LineTo(251,501);
Image1.Canvas.MoveTo(241,20);
Image1.Canvas.LineTo(251,0);
Image1.Canvas.LineTo(261,20);
Image1.Canvas.MoveTo(481,241);
Image1.Canvas.LineTo(501,251);
Image1.Canvas.LineTo(481,261);
Image1.Canvas.TextOut(240,10,'y');
Image1.Canvas.TextOut(480,230,'x');
end;
procedure TForm1.N2Click(Sender: TObject);
begin close; end;
procedure TForm1.N1Click(Sender: TObject);
Begin
MessageDlg('программа рисует функцию, заданную в подпрограмме-функция. В окне масштаб вводится число отрезков на которые разбиваются координатные прямые',mtinformation,[mbok],0)
End; end.
Вывод иллюстраций
Наиболее просто вывести иллюстрацию, которая находится в файле с расширением bmp, jpg или ico, можно при помощи компонента image, значок которого находится на вкладке Additionalпалитры (рис. 10.11).
Рис. 10.11. Значок компонента Image
В табл. 10.8 перечислены основные свойства компонента image.
Таблица 10.8. Свойства компонента image
Свойство | Определяет | ||
Picture Width, Height AutoSize Strech Visible | Иллюстрацию, которая отображается в поле компонента Размер компонента. Если размер компонента меньше размера иллюстрации, и значение свойств AutoSize и strech равно False, то отображается часть иллюстрации Признак автоматического изменения размера компонента в соответствии с реальным размером иллюстрации Признак автоматического масштабирования иллюстрации в соответствии с реальным размером компонента. Чтобы было выполнено масштабирование, значение свойства AutoSize должно быть False Отображается ли компонент, и, соответственно, иллюстрация, на поверхности формы | ||
Иллюстрацию, которая будет выведена в поле компонента image, можно задать как во время разработки формы приложения, так и во время работы программы.
Во время разработки формы иллюстрация задается установкой значения свойства picture путем выбора файла иллюстрации в стандартном диалоговом окне, которое появляется в результате щелчка на командной кнопке Loadокна Picture Editor(рис. 10.12). Чтобы запустить Image Editor, нужно в окне Object Inspectorвыбрать свойство Picture и щелкнуть на кнопке с тремя точками.
Если размер иллюстрации больше размера компонента, то свойству strech нужно присвоить значение True и установить значения свойств width и Height пропорционально реальным размерам иллюстрации.
Чтобы вывести иллюстрацию в поле компонента image во время работы программы, нужно применить метод LoadFromFile к свойству Picture, указав в качестве параметра имя файла иллюстрации. Например, инструкция
Form1.Image1.Picture.LoadFromFile('e:\temp\bart.bmp')
загружает иллюстрацию из файла bart.bmp и выводит ее в поле вывода иллюстрации (image1).
Метод LoadFromFile позволяет отображать иллюстрации различных графических форматов: BMP, WMF, JPEG (файлы с расширением jpg).
Следующая программа, ее текст приведен в листинге 10.6, использует компонент image для просмотра иллюстраций, которые находятся в указанном пользователем каталоге. Диалоговое окно программы приведено на рис. 10.13.
Рис. 10.12. Окно Picture Editor
Рис. 10.13. Слайд-проектор