Zobrazí 2D graf prezentovaný nasledovnými funkciami

Delphi & Pascal (česká wiki)
Přejít na: navigace, hledání
Kategórie: Programy v Pascalu

Program: Graf2d.pas
Soubor exe: Graf2d.exe
Potřebné: Egavga.bgi

Zobrazí 2D graf prezentovaný nasledovnými funkciami. x = 6*(4+sin(t)+3*cos(t)-0.7*sin(2*t)+0.8*cos(15*t)+0.3*abs(cos(30*t)))*cos(t)-15
y = 6*(6+sin(t)+3*cos(t)-0.9*sin(2*t)+0.3*cos(15*t)+0.3*abs(cos(30*t)))*sin(t)
X, Y sú definované v FuncX(), FuncY().
{ GRAF2D.PAS                Copyright (c) TrSek alias Zdeno Sekerak }
{ Zobrazí 2D graf prezentovaný nasledovnými funkciami X,Y.          }
{ X, Y sú definované v FuncX(), FuncY().                            }
{                                                                   }
{ Datum:13.07.2013                             http://www.trsek.com }
 
program graf2d;
 
uses  Graph,Crt;
const PocKrok = 360;    { max kruhu v radianoch }
       c_move = 50;
         os_x = 320;    { stred osi x }
         os_y = 240;    { stred osi y }
 
var
 Gd, Gm: Integer;
 I, Width,ix,iy: Integer;
 krokeps,krokx,kroky: Integer;
 xx,yy,t,epsilon :real;
 
 
{ X-ova zlozka funkcie }
function FuncX(i:integer):integer;
var  t:real;
    xx:real;
     x:integer;
begin
   t:=i*2*pi/360;
  xx:=6*(4+sin(t)+3*cos(t)-0.7*sin(2*t)+0.8*cos(15*t)+0.3*abs(cos(30*t)))*cos(t)-15;
  FuncX:=os_x+round((xx/c_move)*240);
end;
 
 
{ Y-ova zlozka funkcie }
function FuncY(i:integer):integer;
var t:real;
   yy:real;
    y:integer;
begin
   t:=i*2*pi/360;
  yy:=6*(6+sin(t)+3*cos(t)-0.9*sin(2*t)+0.3*cos(15*t)+0.3*abs(cos(30*t)))*sin(t);
  FuncY:=os_y-round((yy/c_move)*240);
end;
 
 
{ vykresli osovy kriz o farbe }
procedure OsKriz;
begin
  SetColor(Red);
  SetLineStyle(SolidLn, 0, NormWidth);
  Line(0,os_y,GetMaxX,os_y);
  Line(os_x,0,os_x,GetMaxY);
end;
 
 
{ nastavenie vykreslovania grafu }
procedure SetGraf(farba,Thiskness:integer);
begin
  SetColor(farba);
  SetLineStyle(SolidLn, 0, Thiskness);
end;
 
 
BEGIN
  Gd := Detect;
  InitGraph(Gd, Gm,'');
  if GraphResult <> grOk then Halt(1);
  outtextxy(10,GetMaxY-20,'Press enter ...');
 
  Width  :=10;
  epsilon:=5;
  krokeps:=round(c_move/epsilon);
 
  OsKriz;
  ReadLn;
 
  { prve vykreslenie }
  SetGraf(Yellow,NormWidth);
  MoveTo( FuncX(0), FuncY(0));
  For i:= 0 to PocKrok do
    LineTo( FuncX(i), FuncY(i));
  ReadLn;
 
  { vyplni zelenou }
  SetFillStyle(SolidFill,Green);
  FloodFill(os_x, os_y, Yellow);
 
  OsKriz;
  ReadLn;
 
  { vykresli pixely }
  For krokx:=-krokeps to krokeps do
    For kroky:=-krokeps to krokeps do begin
      xx:=(epsilon/2)+epsilon*krokx;
      yy:=(epsilon/2)+epsilon*kroky;
      ix:=round((xx/c_move)*240);
      iy:=round((yy/c_move)*240);
 
      { akej farby ma byt pixel }
      if( GetPixel(os_x+ix,os_y-iy)=Green)then
          PutPixel(os_x+ix,os_y-iy,Red)
      else
          PutPixel(os_x+ix,os_y-iy,White)
    end;
  ReadLn;
 
  { vykresli siet - vodorovne }
  SetGraf(Magenta, NormWidth);
  For krokx:=-krokeps to krokeps+1 do begin
    delay(10);
    xx:=epsilon*krokx;
    ix:=round((xx/c_move)*240);
    Line(os_x+ix,0,os_x+ix,GetMaxY);
  end;
  ReadLn;
 
  { vykresli siet - zvisle }
  For kroky:=-krokeps to krokeps do begin
    delay(10);
    yy:=epsilon*kroky;
    iy:=round((yy/c_move)*240);
    Line(0,os_y-iy,GetMaxX,os_y-iy);
  end;
 
  OsKriz;
  ReadLn;
 
  { znova vykresli }
  SetGraf(Green, NormWidth);
  MoveTo( FuncX(0), FuncY(0));
  For i:= 0 to PocKrok do
    LineTo( FuncX(i), FuncY(i));
  ReadLn;
 
  { slusnost vravi uzavriet grafiku }
  CloseGraph;
END.