Содержание занятия: Принципы изображения графиков функций. Масштабирование: связь физических и экранных координат. Вывод текста в графическом режиме (использование строковых переменных, перевод числовых значений в строковые с помощью функции Str , операторы OutText, OutTextXY).
1.Теория
Необходимо нарисовать на экране график заданной функции, например:
y=a·Sin(x) , xÎ[xmin, xmax].
Трудность заключается в том, что точки экрана нумеруются координатами по горизонтальной оси от 0 до 639, по вертикальной оси от 0 до 399, и эта ось направлена вниз.
Задача решается в два этапа:
1) выясняются пределы изменения х и у заданной функции (для этого надо распечатать её таблицу или провести анализ функции)
2) рисуется график функции с пересчетом координат (х, у) каждой точки графика в экранные координаты (i, j).
2.Выбор пределов изменения х и заданной функции.
Задаём интервал изменения х: от хmin до хmax и распечатываем значения функции с таким шагом h (по х), чтобы в таблице было 10 – 20 строчек, например, так:
programgrafic;
Var
a, x, y, xmin, xmax, h: real;
Begin
write(‘Введите х min и max’);
readln( xmin, xmax);
a:=3;
h:=(xmax - xmin)/20;
x:=xmin;
while x<=xmax do
Begin
y:=a*sin(x);
writeln(x, y);
x:=x+h;
end;
End.
Из таблицы на экране определите max и min значения функции в этом интервале – ymax и ymin. Если функция в задаче задана параметрически, т.е. x(t) и y(t), где t-параметр, то в программе именно его следует изменять с равным шагом, а значения x(t) и y(t) –выводить на экран.
С другой стороны, изображаемые функции всегда состоят из комбинации элементарных функций, свойства которых известны. Поэтому можно определить пределы изменения значения функции, анализируя ее вид. Например, для данной функции y(x)=a·sin(x) легко видеть, что если sin(x) изменяется от –1 до 1, то a·sin(x) будет изменяться от –а до а.
3.Рисование графика
Итак, для изображения графика заданной функции на экране, необходимо произвести масштабирование: пересчитать координаты (x,y) в экранные координаты (i, j). Это легко можно сделать, если ввести коэффициенты пересчета
Cx=Ims/(xmax-xmin ) Cy=Jms/(ymax-ymin).
Здесь Ims и Jms -максимальные значения координат экрана. В любом режиме их можно найти с помощью функций
Ims:=GetMaxX Jms:=GetMaxY
xmax, xmin и ymax,ymin -максимальное и минимальное значения аргумента и функции, которые Вы хотите строить. Тогда экранные координаты точки (x,y) графика рассчитываются с помощью этих коэффициентов пересчета:
В последней формуле также учтено, что направление оси Y - вверх. Введение таких коэффициентов пересчета позволяет растянуть (или сжать) график так, что точке xmin соответствует экранная координата i=0, а точке xmax –экранная координата i=639, в чем легко убедиться, подставив эти значения в формулу. То же самое –для экранных координат по вертикальной оси, только уmin соответствует экранная координата j=399, а уmax соответствует экранная координата j=0.
В приведенной ниже программе на языке Турбо Паскаль коэффициенты рассчитаны так:
cx:=(getmaxx-10)/(xmax-xmin);
jmax:=getmaxy-5;
cy:=jmax/(ymax-ymin);
Здесь для более эстетичного расположения графика на экране Ims и Jms сделаны меньше, при этом части графика не упираются в границы экрана.
Для увеличения читаемости графика, его следует подписать, т.е. указать название изображенной функции и значения ее параметров. Например, так:
OutTextXY(45, 15, ‘график функции y=а*Sin(x)’);
В этом фрагменте набор чисел – координаты точки начала текста на экране. Если часть текста, который должен быть выведен на экран, заранее не известен (например, значение параметра a), то его можно вывести с помощью переменной типа string, сформировав ее в процессе выполнения программы:
где функция Str(a,sa) переводит числовое значение переменной a в текст, помещаемый в строковую переменную sa, содержимое которой выводится на экран оператором OutTextXY(45, 40, sa).
Оси координат необходимо изобразить на графике с помощью операторов Line. При этом надо помнить, что это прямые у=0 (ось абсцисс) и х=0 (ось ординат). Соответствующие экранные координаты можно получить, подставив эти значения в формулы для i и j.
В программе, приведенной ниже, строится график функции y=а*Sin(x). Вы можете воспользоваться этой программой, устанавливая свои значения xmin, xmax, ymin, ymax, вписав свою функцию и исправив подпись к рисунку.
programgrafic;
usesgraph;
Var
a, x, y, xmin, xmax, h: real;
ymin, ymax, cx, cy: real;
gd, gm: integer;
i, j, jmax: integer;
Begin
gd:=detect; {установка графического режима}
initgraph(gd, gm, ‘’);
{подпись графика функции}
outtextxy(45, 15, ‘график функции y=Sin(ax)’);
outtextxy(45, 25, ‘параметр а=1’);
{вычисление коэффициента пересчета}
ymin:=-1; ymax:=1; a:=1;
xmin:=-3.14; xmax:=3.14; h:=0.01;
cx:=(getmaxx-10)/(xmax-xmin);
jmax:=getmaxy-5;
cy:=jmax/(ymax-ymin);
{рисование осей}
i:=round(-xmin*cx);
j:=jmax-round(-ymin*cy);
setcolor(14);
line(i, 5, i, jmax);
line(10, j, getmaxx-10, j);
{рисование графика}
x:=xmin;
while x<=xmax do
Begin
y:=a*sin(x); {вычисление функции}
i:=round(cx*(x-xmin));
j:=jmax-round(cy*(y-ymin));
putpixel(i, j, 2);
x:=x+h;
end;
readln;
closegraph;
End.
4.Самостоятельная работа.
Каждый студент получает индивидуальную задачу из раздела 5 пособия «Программирование физических задач».
Требования при защите задачи.
1.В программе необходимо подключить графическую библиотеку и открыть графический режим. Студент должен знать чем отличаются текстовый и графический режимы, в каких модулях находятся используемые смысл
2.Нужно организовать ввод параметров кривой с клавиатуры (если в задаче требуется) , нарисовать оси координат и вывести на экран название кривой и значение ее параметров.
3.Кривая рисуется по точкам с помощью оператора цикла.