Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Построение графиков

 

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

 

Рассмотрим в качестве примера задачу построения линейного графика произвольной функции в заданном диапазоне изменения аргумента. Исходными данными в этой задаче являются: функция, график которой строится, диапазоны изменения аргумента a и b, и количество точек N, отображаемых на графике (или шаг изменения аргумента dx). При решения поставленной задачи желательно придерживаться следующей последовательности действий:

1. ввод исходных данных;

2. табулирование функции (вычисление значений функции при изменении аргумента от a до b с шагом dx);

3. определение минимального и максимального значений функции на заданном интервале;

4. определение мировой системы координат;

5. построение осей координат;

6. построение графика функции.

 

Рассмотрим реализацию некоторых из перечисленных действий и оформим их в виде отдельных процедур и функций. В основной программе опишем следующие константы и переменные:

 

CONST

N = 50;

VAR

X, Y: array[1..N] of real;

Константа N задает число точек отображаемых на графике. В массивы X и Y мы поместим результаты табулирования функции.

Кроме этого, будем подразумевать, что в программу включено описание:

· целочисленных переменных XWmin, XWmax, YWmin и YWmax, определяющих координаты окна вывода (см. выше);

· вещественных переменных xmin, xmax, ymin, ymax, определяющих математическую систему координат;

· процедур SetWindow и SetWorldCoords (см. выше);

· двух функций преобразования координат Xs и Ys;

· целочисленных переменных GrDr и GrMd, необходимых для процедуры инициализации графики.

 

Табулирование функции:

 

PROCEDURE TablFunc(a, b: real);

VAR

i: integer;

function F(x: real): real;

begin

F:= выражение для функции, график которой нужно построить;

end;

BEGIN

for i:=1 to N do begin

X[i]:= a + (b-a)/(N-1)*(i-1);

Y[i]: F(X[i]);

end;

END;

 

Определение минимального и максимального значений функции:

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

 

FUNCTION MinY: real;

VAR i: integer;

m: real;

BEGIN

m:= Y[1];

for i:=2 to N do if Y[i]<m then m:= Y[i];

MinY:= m

END;

 

FUNCTION MaxY: real;

VAR i: integer;

m: real;

BEGIN

m:= Y[1];

for i:=2 to N do if Y[i]>m then m:= Y[i];

MaxY:= m

END;

 

Оси координат:

Основой для построения любых графиков и диаграмм является система координат. Ниже приведена процедура построения на экране декартовой системы координат с изображением осей и разметкой по периметру. Процедура имеет два параметра nx и ny, которые определяют количество штрихов на оси OX и OY, соответственно.

 

 

PROCEDURE BuildCoords(nx, ny: Byte);

VAR

i: Byte;

v: real;

s: string;

BEGIN

SetColor(White);

Rectangle(XWmin, YWmin, XWmax, YWmax); { область графика }

Line(Xs(xmin), Ys(0), Xs(xmax), Ys(0)); { ось ОХ }

Line(Xs(0), Ys(ymax), Xs(0), Ys(ymin)); { ось OY }

SetTextStyle(SmallFont,0,5); { выбор шрифта Small }

SetTextJustify(CenterText,CenterText); { выравнивание текста }

 

{ Разметка оси Х }

 

for i:=0 to nx-1 do begin

v:= xmin + (xmax-xmin)/(nx-1)*i; { координата i-го штриха }

Str(v:5:2,s); { преобразование числа в строку }

Line(Xs(v), YWmax, Xs(v), YWmax+5); { черчение i-го штриха }

OutTextXY(Xs(v), YWmax+15, s); { вывод числа }

end;

 

{ Разметка оси Y }

 

for i:=0 to ny-1 do begin

v:= ymin + (ymax-ymin)/(ny-1)*i;

Str(v:5:2,s);

Line(XWmin, Ys(v), XWmin-5, Ys(v));

OutTextXY(XWmin-30, Ys(v), s);

end;

END;

 

Построение графика:

 

PROCEDURE Graphic(Color: word);

VAR i: integer;

BEGIN

SetColor(Color);

MoveTo(Xs(X[1]), Ys(Y[1]));

Circle(Xs(X[1]), Ys(Y[1]), 2);

FOR i:=2 TO N DO begin

LineTo(Xs(X[i]), Ys(Y[i]));

Circle(Xs(X[i]), Ys(Y[i]), 2);

end;

END;

 

Процедура Graphic строит точечно-линейный график по точкам, хранящимся в массивах X и Y. Параметр Color определяет цвет линии.

 

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

 

PROGRAM Graphic_of_Function;

USES CRT, Graph;

CONST

N = 50;

VAR

X, Y: array[1..N] of real;

VAR

Описание переменных XWmin, XWmax, YWmin, YWmax;

Описание переменных xmin, xmax, ymin, ymax;

Описание процедуры SetWorldCoords;

Описание процедуры SetWindow;

Описание функции Xs;

Описание функции Ys;

Описание процедуры TablFunc;

Описание функции MinY;

Описание функции MaxY;

Описание процедуры BuildCoords;

Описание процедуры Graphic;

VAR

a, b: real;

GrDr, GrMd: integer;

 

BEGIN

ClrScr;

Write(‘Введите пределы изменения аргумента [a, b]: ’);

ReadLn(a, b);

TablFunc(a, b);

GrDr:= detect;

InitGraph(GrDr, GrMd, ‘C:\TP7\BGI’);

SetWindow(100, 50, 500, 400);

SetWorldCoords(a, MinY, b, MaxY);

BuildCoords(5, 5);

Graphic(Yellow);

ReadKey;

CloseGraph;

END.

 

Эту программу легко изменить с тем, что бы она строила график по заданным точкам, полученным, например, в результате некоторого эксперимента. Собственно говоря, ничего менять для этого не нужно. Необходимо написать новую процедуру заполнения массивов X и Y. Напомним, что раньше этим занималась процедура TablFunc. Процедура ввода данных может быть оформлена следующим образом:

 

PROCEDURE ReadDATA;

VAR

i: integer;

 

BEGIN

WriteLn(‘Введите попарно координаты точек X, Y: ’);

FOR i:=1 TO N DO begin

Write(i,‘-я точка: ’);

ReadLn(X[i], Y[i])

end

END;

 

После чего в основном блоке программы вместо вызова процедуры TablFunc нужно поставить вызов процедуры ReadDATA.

 

На первый взгляд, рассмотренная выше программа построения линейных графиков может показаться несколько сложной (хотя это только кажущаяся сложность) и перегруженной различными процедурами и функциями. Основное достоинство рассмотренного подхода и программы в их относительной универсальности: какую бы Вы функцию не задали, какие бы Вы не ввели пределы изменения аргумента, программа обязательно построит желаемый график. Причем все изображение графика будет точно умещаться в рамках отведенного окна. Безусловно за универсальность приходится платить, и в данном случае, ценой введения разнообразных переменных и подпрограмм. Зато используя арсенал этих подпрограмм можно с одинаковой легкостью построить на экране как один график, так и целых десять, каждый из которых будет иметь свои оси координат. При желании описание некоторых подпрограмм (таких, как SetWindow, SetWorldCoords, Xs, Ys), а также переменных XWmin, XWmax, YWmin, YWmax, xmin, xmax, ymin и ymax можно оформить в виде отдельного модуля. Можно также добавить процедуры построения графиков других видов. Все это позволит в дальнейшим значительно упростить написание программ, предусматривающих построение графиков.

 

4. Когда нет времени…

 

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

 

Для примера рассмотрим простую задачу:

 

Камень брошен вверх под углом ά к горизонт с начальной скоростью. Требуется построить на экране траектории движения камня при разных значениях угла бросания.

Уравнения движения для координат камня x и y в неподвижной инерциальной системе отсчета имеют вид:

При заданных значения и максимальная высота подъема камня над горизонтом и максимальная дальность полета определяются соответственно:

 

,

 

.

 

Для построения траектории движения камня при заданных значения и необходимо, изменяя значение t с некоторым шагом , вычислять координаты x и y и отображать их на экране. Для того чтобы на экране “уместились” все траектории с различными значениями угла бросания необходимо сначала определить максимальную дальность полета и высоту подъема при заданном значении . Очевидно, что максимальная дальность полета будет равна (при ), а максимальная высота подъема (при ).

 

Определим декартову систему координат (мировые координаты) относительно которой будем строить траектории движения камня:

 

xmin = 0, xmax = , ymin = 0, ymax = .

 

С учетом формул (1) экранные координаты будут определятся следующими выражениями:

 

, ,

 

где введены обозначения: и .

 

Ниже приведена соответствующая программа.

 

PROGRAM Stone;

USES CRT, Graph;

CONST

g = 9.8;

VAR

x, y, t, dt,

v0, alpha,

gx, gy: real;

xs, ys,

GrDr, GrMd: integer;

 

BEGIN

ClrScr;

Write(‘Введите начальную скорость камня Vo [м/с]: ’);

ReadLn(v0);

{ Инициализация графического режима }

GrDr:= detect;

InitGraph(GrDr, GrMd, ‘C:\TP7\BGI’);

Line(0, GetMaxY, GetMaxX, GetMaxY); { ось OX (поверхность Земли) }

{ Масштабные множители }

gx:= GetMaxX / (sqr(v0)/g);

gy:= GetMaxY / (sqr(v0)/(2*g));

{ Начальный угол бросания }

alpha:= 10;

REPEAT

{ Шаг по времени = 1/1000 от времени полета }

dt:= (2*v0*sin(alpha*pi/180)/g)/1000;

t:= 0;

REPEAT

x:= v0*cos(alpha*pi/180)*t;

y:= v0*sin(alpha*pi/180)*t-g*sqr(t)/2;

{ Вычисляем экранные координаты и ставим желтую точку }

xs:= round(gx*x);

ys:= GetMaxY - round(gy*y);

PutPixel(xs, ys, Yellow);

t:= t + dt;

UNTIL (y<0);

alpha:= alpha + 5; { Увеличиваем угол бросания на 5 градусов }

UNTIL (alpha>90);

ReadKey;

CloseGraph;

END.

 

 

<== предыдущая лекция | следующая лекция ==>
Окно вывода | В векторной графике
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 530; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.058 сек.