Как то попросили написать одному студенту програмку для построения графиков функций на зачет. Вспомнил молодость :)
Для сборки под линуксом нужен
Free Pascal Compiler и библиотека svgalib
Uses Graph;
Const Sx=400; // Screen center X
Const Sy=300; // Screen center Y
Const Smx=250; // Oblast' grafika -Smx<>Smx
Const Smy=250; // Oblast' grafika -Smy<>Smy
Const nlines=1000; //Chislo otschetov
Const ndels=10; //N delenii
Const hdels=0.01; //vysota deleniya
//Const Rmx=50.0; // -Rmx <-x-> Rmx
//Const Rmy=50.0; // -Rmy <-y-> Rmy
Const funcname='y=x/sin(x)';
var Rmx,Rmy: real;
var gd,gm:integer;
var x,y,dx,dy: real;
var i: integer;
var text: string[10];
function f(x: real): real;
var y: real;
begin
if sin(x)=0 then x:=0.000000000000001; // DivByZero zaglushka
y := x/sin(x); // Our function
if y>Rmy then y := Rmy;
if y<-Rmy then y := -Rmy;
f := y;
end;
procedure drawline(x1,y1,x2,y2: real); //liniya v realnyh coordinatah
begin
line(Sx+round(Smx/Rmx*x1), Sy-round(Smy/Rmy*y1), Sx+round(Smx/Rmx*x2), Sy-round(Smy/Rmy*y2));
end;
procedure drawtext(x,y: real; a: string[5]; Xofs, Yofs: integer); // Text v realnyh coordinatah
begin
outtextxy(Sx+round(Smx/Rmx*x)+Xofs, Sy-round(Smy/Rmy*y)-Yofs, a);
end;
begin
writeln('Function: '+funcname);
write('-X<- x ->X, X=');
readln(Rmx);
write('-Y<- f(x) ->Y, Y=');
readln(Rmy);
INITGRAPH(gd,gm,'');
Setcolor(15);
bar(Sx-Smx-50,Sy-Smy-50,Sx+Smx+50,Sy+Smy+50); //fon
Setcolor(0);
outtextxy(Sx-Smx-15,Sy-Smy-15,funcname); // nazvanie grafika
Setcolor(1);
drawline(-Rmx,0,Rmx,0); //OS x
drawline(0,-Rmy,0,Rmy); //OS y
//Deleniya po X
x := -Rmx;
dx := Rmx*2/ndels;
dy := Rmy*2*hdels;
while x<=Rmx do
begin
drawline(x,-dy, x, dy);
str(x:5:2,text);
drawtext(x,-dy,text,-20,-3);
x := x + dx;
end;
//Deleniya po Y
y := -Rmy;
dy := Rmy*2*ndels;
dx := Rmx*2*hdels;
while y<=Rmy do
begin
drawline(-dx,y, dx, y);
str(y:5:2,text);
if (y<>0) then drawtext(-dx,y,text,-50,3);
y := y + dy;
end;
Setcolor(2);
//Graffik
dx := Rmx*2/nlines;
x := -Rmx;
while x<=Rmx-dx do
begin
if ((f(x)+f(x+dx)) <> 0) or (abs(f(x)) <> Rmy) then drawline(x, f(x), x+dx, f(x+dx));
x := x + dx;
end;
readln();
end.