Полезное:


Главная / How-To / SysAdmin / Рисуем график на паскале
Рисуем график на паскале

Как то попросили написать одному студенту програмку для построения графиков функций на зачет. Вспомнил молодость :)

Для сборки под линуксом нужен 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.

Добавлено: 2008/07/12
Обновлено: 2008/11/16

Навигация
Обо мне | Портфолио | How-To | Мои ссылки | Фотоальбом | Смешно! | Контакты Адрес: Россия, Владивосток
Тел.: +7 (4232) 51-84-81