Здесь предлагаются программы построения графиков функций
 в 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.

 
Конструктор сайтов - uCoz