Здесь предлагаются программы построения графиков функций
в PascalABC. В программах используются минимальные средства для масштабирования.Однако они достаточны для большинства учебных примеров.Масштаб одинаков по обеим осям с коэффициентом увеличения от 0.8 до 3.Он выбирается оптимальным при повторении запуска программы.Сначала строятся графики неполного многочлена 3-й степени и тангенса при обычном задании функции.Далее показано как будет выглядеть программа, если функция задана параметрически - на примере циклоиды, в полярных координатах - на примере кардиоиды и в неявном виде - один из овалов Декарта. Если не использовать модуль crt,то коэффициент масштаба k придётся вводить в теле программы. Надо будет также удалить операторы этого модуля clrscr , textsize, hidecursor. Преимуществом графического окна является возможность изменения его размеров посредством мыши после выполнения программы. Но мы здесь предпочитаем возможность ввода k и возможных параметров функций при работе программы.При желании конечно можно добавить операторы написания заголовка окна,установки размеров окна и.т.д.
На сайте есть ещё страница - Построение графиков(продолжение).Заход через Главную страницу.
(Оказалось, что размеры CRT -окна различны на разных компьютера.Т.е. надо корректировать положение осей и надписей на графике для конкретного компьютера или использовать оператор установки размеров окна - setwindowsize)
program gr;
uses GraphABC,crt;
var
n,i:integer;
x,k:real;
Function y(x:real):real;
begin
y:=x*x*x-4*x+2;{функция может быть любой,например: y=sin(x)}
end;
begin,
write('k=(0.8-3)');
read(k);
clrscr;
textsize(11);
setpencolor(clblack);
textout(323,192,'0');
textout(323,10,'Y');
textout(690,192,'X');
for n:=-20 to 20 do
line(320+trunc(25*n*k),0,320+trunc(25*n*k),480);
for n:=-20 to 20 do
line(0,190 +trunc(25*n*k),1000,trunc(190+25*n*k));
for i:=-10000 to 10000 do {-20000 to 20000 если х=i/1000}
begin
x:=i/500;{если график распадается на точки можно i/1000}
setpixel(320+trunc(25*x*k),190-trunc(25*(y(x))*k),clblue);
end;
hidecursor;
end.
Конечно вместо точек можно использовать линии с оператором lineto c теми же координатами, что и в setpixel. Только цвет линии графика нужно задать предварительно оператором setpencolor и перед циклом задать начальное положение курсора за пределами экрана, например moоveto(-500,190 - trunc(25*y(-21))).
Такой вариант предпочтителен для крутых графиков типа тангенса.При этом нарисуются даже асимптоты.
program gr;
uses GraphABC,crt;
var
n,i:integer;
x,k:real;
Function y(x:real):real;
begin
y:=sin(x)/cos(x); {функция}
end;
begin
write('k=(0.8-4)');
read(k);
clrscr;
textsize(11);
setpencolor(clblack);
textout(323,192,'0');
textout(323,10,'Y');
textout(690,192,'X');
for n:=-20 to 20 do
line(320+trunc(25*n*k),0,320+trunc(25*n*k),480);
for n:=-20 to 20 do
line(0,190 +trunc(25*n*k),1000,trunc(190+25*n*k));
setpencolor(clred);
line(0,190,720,190);
line(320,0,320,480);
setpencolor(clblue);
moveto(320-trunc(800*k),190-trunc(25*y(-20)*k));
for i:=-10000 to 10000 do
begin
x:=i/500;
lineto( 320+trunc(25*x*k),190-trunc(25*(y(x))*k));
end;
hidecursor;
end.
Если функция задана параметрически, то программа выглядит следующим образом.Функцией является циклоида.
program grpar;
uses GraphABC,crt;
var
n,i:integer;
t,k:real;
Function y(t:real):real;
begin
y:=r-r*cos(t);
end;
Function x(t:real):real;
begin
x:=r*t-r*sin(t);
end;
begin
write('k=(0.8-3)');
read(k);
write(' r=');
read(r);
clrscr;
textsize(11);
setpencolor(clblack);
textout(323,192,'0');
textout(323,10,'Y');
textout(690,192,'X');
for n:=-20 to 20 do
line(320+trunc(25*n*k),0,320+trunc(25*n*k),480);
for n:=-20 to 20 do
line(0,190 +trunc(25*n*k),1000,trunc(190+25*n*k));
for i:=-10000 to 10000 do
begin
t:=i/500;
setpixel(320+trunc(25*x(t)*k),190-trunc(25*(y(t))*k),clblue);
end;
hidecursor;
end.
Здесь k=2, r=1
Для функции в полярных координатах программа имеет такой вид.Функция - кардиоида: r = a*(1+cos(f)).
program grpol;
uses GraphABC,crt;
var
n,i,c:integer;
f,k,l,a:real;
Function y(f:real):real;
begin
y:=a*(1+cos(f))*sin(f);
end;
Function x(f:real):real;
begin
x:=a*(1+cos(f))*cos(f);
end;
begin
write('k=(0.8-3)');
read(k);
write(' a=');
read(a);
clrscr;
textsize(11);
l:=640*(1+k/20);
c:=trunc(l);
setpencolor(clblack);
textout(323,192,'0');
textout(323,10,'Y');
textout(c,192,'X');
for n:=-20 to 20 do
line(320+trunc(25*n*k),0,320+trunc(25*n*k),480);
for n:=-20 to 20 do
line(0,190 +trunc(25*n*k),1000,trunc(190+25*n*k));
for i:= 0 to 10000 do
begin
f:=i/500;
setpixel(320+trunc(25*x(f)*k),190-trunc(25*(y(f))*k),clblue);
end;
hidecursor;
end.
.
В случае неявной функциии, производим сканирование по x и y и вычисляем значени функции F(x,y)< epsilon, где это число близкое к 0.
(epsilon = 0.003, сам ноль так поймать трудно.Главное, чтобы график не был слишком толстым или тонким и прерывистым.Пределы сканирования желательно делать минимальным, так как время счёта велико.Функция - один из овалов Декарта.)
program grnejavn;
uses GraphABC,crt;
var
n,i,j,r:integer;
y,x,k,l:real;
Function z(x:real;y:real):real;
begin
z:=sqr(x*x+y*y-2*x)-(x*x+y*y); {уравнение}
end;
begin
write('k=(0.7-3)');
read(k);
clrscr;
textsize(11);
l:=640*(1+k/20);
r:=trunc(l);
setpencolor(clblack);
textout(323,192,'0');
textout(323,10,'Y');
textout(r,192,'X');
for n:=-20 to 20 do
line(320+trunc(25*n*k),0,320+trunc(25*n*k),480);
for n:=-20 to 20 do
line(0,190 +trunc(25*n*k),1000,trunc(190+25*n*k));
for i:=-500 to 2000 do
begin
x:=i/500;
for j:=-2500 to 2500 do {пределы циклов выбираем,если можно оценить диапазон изменений x и y,в соотношении 500:1 }
begin
y:=j/500;
if abs(z(x,y))<0.003 then setpixel(320+trunc(25*x*k),190-trunc(25*y*k),clred);
end;
end;
hidecursor;
end.
|