И. И. Мечникова лаборатория кафедра компьютерных методов экспериментальной экспериментальной физики физики компьютерный практикум

Вид материалаПрактикум

Содержание


5. Пример законченной программы построения графиков функций
Подобный материал:
1   2   3   4   5
^

5. Пример законченной программы построения графиков функций




Рассмотрим пример написания программы, которая строит графики функций


µ §

в интервале изменения аргумента x от 0 до 2 и производит оформление графиков, включая разметку координатных осей и вывод пояснительных надписей.

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

Пример такой программы GR_4 приведен ниже. Она проводит вычисление значений функций (они обозначены F1 и F2) в 101 точке от MinX=0 до MaxX=2 (NPoints=100 и еще точка X=0). Шаг изменения аргумента обозначен Step. Для хранения результатов вычисления функций используется вспомогательный массив Fn из двух элементов. Использование массива позволяет только один раз вычислять функции в каждой точке, а потом в нужных местах просто подставлять готовые значения. Как видно из программы, этих подстановок четыре (см. операторы if...). Следовательно, данный прием существенно сокращает время вычислений.

Программа GR_4 позволяет также вывести на экран таблицу всех значений функций, если удалить знаки комментария { и }, окружающие соответствующий участок программы.


program GR_4;


const

NPoints = 100;

MinX = 0.0; MaxX = 2.0;

var

i, k: integer;

Step, X, MinY, MaxY: real;

Fn: array [1..2] of real;


{ функции, гpафики котоpых стpоятся }


function F1 (t: real): real;

begin

F1:= Sqr(Sin(Pi*t))/(t+1)

end;


function F2 (t: real): real;

begin

F2:= 1/2/(t+1)

end;


{ ----------------------------------------- }

BEGIN

Step:= (MaxX-MinX)/NPoints;


MinY:= F1 (MinX); MaxY:= F1 (MinX);

for i:= 0 to NPoints do

begin

X:= Step * i;


Fn [1]:= F1 (X);

Fn [2]:= F2 (X);

{

Write (t:12:3);

for k:= 1 to 2 do

Write (Fn [k]:12:3);

Writeln;

}

for k:= 1 to 2 do

begin

if Fn [k] < MinY then

MinY:= Fn [k];

if Fn [k] > MaxY then

MaxY:= Fn [k]

end

end;

Writeln;

Writeln ('Минимум =', MinY:7:3);

Writeln ('Максимум =', MaxY:7:3);


Readln

END.


Результаты работы программы:


Минимум = 0.000

Максимум = 0.674


Теперь, когда известны пределы изменения функций, можно приступить к размещению графика на экране. Предположим, что компьютер оснащен VGA-адаптером, т.е. экран имеет ширину 640 пикселов и высоту 480 пикселов. Разместим график внутри прямоугольной области шириной Width=500 и высотой Height=400 пикселов. Поскольку график располагается в первом квадранте, начало координат поместим в левый нижний угол области с экранными координатами X0scr=100 и Y0scr=400. Оставшиеся 99 пикселов слева и 79 пикселов снизу от этой области отведем для размещения оцифровки осей и названия графика.

В пределах графика аргумент меняется от MinX=0 до MaxX=2. Функции меняются от MinY=0 до 0.674 . Чтобы оставить над кривыми немного свободного места, возьмем MaxY=0.8 .

Все определенные выше параметры графика зададим в программе в виде констант.

Далее установим связь между экранными координатами и значениями аргумента и функций. Пусть ScaleX - масштабный множитель, имеющий смысл числа пикселов, приходящихся на единицу изменения аргумента, т.е. ScaleX = Width / (MaxX - MinX). Тогда горизонтальная экранная координата Xscr точки, соответствующей значению аргумента X, равна

Xscr = X0scr + Round (ScaleX*X) .

Аналогично для вертикальной экранной координаты

Yscr = Y0scr - Round (ScaleY*Y) .

Знак минус во второй формуле связан с тем, что вертикальная экранная координата отсчитывается сверху вниз, в то время как ось ординат графика направлена снизу вверх. Функция округления Round используется для получения целочисленных экранных координат.

Две последние формулы используем в функциях вычисления экранных координат, которые зададим в разделе описаний программы после описания переменных. Здесь же опишем функции F1 и F2, графики которых мы строим.

В основной части программы после перехода в графический режим организуем вычисление масштабных множителей ScaleX и ScaleY и шага изменения аргумента Step. Далее начертим прямоугольник, внутри которого будет размещен график.

График первой функции изобразим в виде линии ярко-красного цвета. Вначале поместим графический указатель в начало кривой Xscr(0), Yscr(0) процедурой MoveTo, а затем в цикле организуем вычисление значений аргумента для следующих точек и проведение отрезков в эти точки процедурой LineTo.

График второй функции изобразим точками ярко-зеленого цвета, используя процедуру PutPixel.

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

Следующий этап - разметка координатных осей, т.е. изображение штрихов и числовых значений возле них. Начнем с горизонтальной оси. Вначале в процедуре SetTextJustify укажем, что выводимые числа должны быть центрированы по горизонтали (CenterText) и расположены ниже координатных штрихов (TopText). Далее в цикле организуем вывод пяти штрихов для значений аргумента 0, 0.5 ... 2 . Эти значения удобно выразить через порядковый номер штриха i. Горизонтальную экранную координату штрихов обозначим Grid. Длина штриха - 5 пикселов. Численные значения под штрихами выводим процедурой OutTextXY, предварительно преобразовав действительное значение 0.5*i в строковую переменную S процедурой Str.

Аналогично размечаем вертикальную ось в точках 0, 0.25, 0.5 и 0.75 .

Заключительная часть программы выводит подписи под осями и заголовок графика. Здесь используется шрифт SmallFont с размером символов 5 и 7.

Ниже приводится полный текст программы построения графика.


program GR_5;


uses Graph;


const

NPoints = 100;

X0Scr = 100; Y0Scr = 400;

Width = 500; Height = 400;

MinX = 0.0; MaxX = 2.0;

MinY = 0.0; MaxY = 0.8;

var

GrDriver, GrMode: integer;

i, Grid: integer;

ScaleX, ScaleY: real;

Step, X: real;

S: string;


{ функции вычисления экpанных кооpдинат }


function Xscr (X:real): integer;

begin

Xscr:= X0scr + Round (ScaleX*X)

end; { Xscr }


function Yscr (Y:real): integer;

begin

Yscr:= Y0scr - Round (ScaleY*Y)

end; { Xscr }


{ функции, гpафики котоpых стpоятся }


function F1 (t: real): real;

begin

F1:= Sqr(Sin(Pi*t))/(t+1)

end;


function F2 (t: real): real;

begin

F2:= 1/2/(t+1)

end;

{ ----------------------------------------- }

BEGIN

GrDriver:= Detect;

InitGraph (GrDriver, GrMode, 'C:\BP\BGI');


{ задание масштабных коэффициентов и шага }

ScaleX:= Width/(MaxX-MinX);

ScaleY:= Height/(MaxY-MinY);

Step:= (MaxX-MinX)/NPoints;


Rectangle (X0Scr, 0, X0Scr+Width, Height); { pамка }


{ вывод кpивой в виде линии }

SetColor (LightRed);

MoveTo ( XScr(0), YScr(0) );

for i:= 1 to NPoints do

begin

X:= Step * i;

LineTo ( XScr(X), YScr(F1(X)) )

end;


{ вывод кpивой точками }

for i:= 0 to NPoints do

begin

X:= Step * i;

PutPixel ( XScr(X), YScr(F2(X)), LightGreen )

end;


{ пояснительные надписи }

SetColor (White);

OutTextXY (260, 100, 'F1(x)');

OutTextXY (320, 250, 'F2(x)');


{ pазметка осей - гоpизонтальная ось }

SetTextJustify (CenterText, TopText);


for i:= 0 to 4 do

begin

Grid:= XScr (0.5*i);

Line (Grid, Height, Grid, Height+5);

Str (0.5*i:3:1, S);

OutTextXY (Grid, Height+10, S)

end;


{ веpтикальная ось }

SetTextJustify (RightText, CenterText);


for i:= 0 to 3 do

begin

Grid:= YScr (i/4);

Line (X0Scr-5, Grid, X0Scr, Grid);

Str (i/4:5:2, S);

OutTextXY (X0Scr-10, Grid, S)

end;


{ подписи под осями и гpафиком }

SetTextJustify (CenterText, CenterText);

SetTextStyle (SmallFont, HorizDir, 5);

OutTextXY (500, 430, 'Значения аpгумента');

OutTextXY (320, 470, '(Виктоp П.А., каф.эксп.физики)');

SetTextStyle (SmallFont, VertDir, 5);

OutTextXY (30, 100, 'Значения функции');

SetColor (Yellow);

SetTextStyle (SmallFont, HorizDir, 7);

OutTextXY (320, 450, 'ГРАФИКИ ДВУХ ФУНКЦИЙ');


Readln;

CloseGraph

END.


Результаты выполнения программы GR_5 представлены на следующем рисунке.