uses graph, crt;
function F(a, b, x: real): real;
begin
F := a * cos(x) + b; { функция }
end;
var
a, b, xn, xk, x, y, mx, my, dx, max, min: real;
x0, y0, i, px, py: integer;
s: string;
begin
clrscr;
writeln('Functia y=acosx+b');
writeln('Vvedite a,b');
readln(a, b);
x0 := 0;
initgraph(x0, y0, '');
x0 := getmaxX div 2; { центр экрана по Х }
xn := -2 * pi;
xk := 2 * pi; { интервал по Х }
max := F(a, b, xn);
min := F(a, b, xn); { найдем максимальное и минимальное значения }
x := xn;
dx := 0.001;
while x <= xk do
begin
if F(a, b, x) > max then
max := F(a, b, x);
if F(a, b, x) < min then
min := F(a, b, x);
x := x + dx;
end;
if (min < 0) and (max > 0)
then { если экстремумы функции по разные строны от Х }
begin
y0 := round(getmaxY * max / (max - min));
{ ось Х между ними пропорционально }
if max > abs(min) then
my := y0 / max { масштаб по У, если макс болше модуля мин }
else
my := y0 / abs(min); { если модуль мин больше }
end
else if (min < 0) and (max < 0) then { если оба ниже Х }
begin
y0 := 50; { ось на 50 пикселей ниже верха }
my := (getmaxY - 70) / abs(min); { масштаб от минимума, он ниже }
end
else if (min > 0) and (max > 0) then { если оба выше оси Х }
begin
y0 := getmaxY - 50; { ось выше на 50 нижней границы экрана }
my := (getmaxY - 70) / max; { делим на мкс, он выше }
end;
mx := 620 / (xk - xn); { масштаб по Х }
setbkcolor(15); { цвет фона }
setcolor(8); { цвет линий }
line(0, y0, getmaxX, y0); { оси }
line(x0, 0, x0, getmaxY);
for i := 1 to round(xk - xn) +
1 do { максимальное количество засечек в одну сторону }
begin
line(x0 - 3, y0 + round(i * my), x0 + 3, y0 + round(i * my));
{ засечки на оси У }
line(x0 - 3, y0 - round(i * my), x0 + 3, y0 - round(i * my));
line(x0 + round(i * mx), y0 - 3, x0 + round(i * mx), y0 + 3);
{ засечки на оси Х }
line(x0 - round(i * mx), y0 - 3, x0 - round(i * mx), y0 + 3);
str(i, s);
{ подпись оси У }
outtextXY(x0 - 15, y0 + round(i * my), '-' + s); { соответственно засечкам }
outtextXY(x0 - 15, y0 - round(i * my), s);
{ подпись оси Х }
str(i, s);
outtextXY(x0 + round(i * mx), y0 + 10, s);
outtextXY(x0 - round(i * mx), y0 + 10, '-' + s);
end;
{ центр }
outtextXY(x0 + 5, y0 + 10, '0');
{ подписи концов осей }
outtextXY(getmaxX - 10, y0 - 10, 'X');
outtextXY(x0 - 10, 10, 'Y');
setcolor(8);
{ график }
x := xn;
while x <= xk do
begin
x := x + dx; { наращиваем х }
px := x0 + round(x * mx); { изменение по оси Х }
y := F(a, b, x); { график в реальных координатах }
py := y0 - round(y * my); { в экранных }
putpixel(px, py, 8);
end;
readln
end.