Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Листинг 10.5. График функции ⇐ ПредыдущаяСтр 3 из 3
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)); with form1.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 Примечание Рассмотренная программа работает корректно, если функция, график которой надо построить, принимает как положительные, так и отрицательные значения. Если функция во всем диапазоне только положительная или только отрицательная, то в программу следует внести изменения. Программа вывода графика любой функции, используя компоненту 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); var x, 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)); for i: =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
Иллюстрацию, которая будет выведена в поле компонента 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. Слайд-проектор Популярное:
|
Последнее изменение этой страницы: 2016-03-15; Просмотров: 1032; Нарушение авторского права страницы