Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Evolvente - GRAFICA.PAS

GRAFICA.PAS

Caricato da: Poggi Marco
Scarica il programma completo

  1. {$mode objfpc}  {$H+}
  2.  
  3. unit Grafica;
  4.  
  5. interface
  6. uses graph, crt;
  7.  
  8. function inizio_graf:boolean;
  9. procedure assi;
  10. procedure fine_graf(pausa:boolean);
  11.  
  12. type tpuntoxy=record
  13.   px,py:double;
  14. end;
  15.  
  16. type finestra=record
  17.   inizio,fine:tpuntoxy;
  18. end;
  19.  
  20. function distanza (tratto:finestra):double;
  21.  
  22. type punto=class
  23.   private
  24.       px,py,maxx,maxy,colore:integer;
  25.       scale:tpuntoxy;
  26.       f:finestra;
  27.       procedure SetX(a:double);
  28.       procedure SetY(a:double);
  29.       procedure setColore(c:integer);
  30.       function  getColore:integer;
  31.   public
  32.       constructor inizio(g:finestra); overload;
  33.       constructor inizio(a,b,c,d:double); overload;
  34.       constructor IsoInizio(cx0,cy0,cxf:double);
  35.       destructor DistruggiPunto;
  36.       procedure assi(c:word);
  37.       procedure punto(x,y:double);
  38.       procedure rettangolo(x,y,x1,y1:double);
  39.       function RuotaPunto(po:tpuntoxy; al:double):tpuntoxy;
  40.       procedure TraslaRuotaPunto(x0,y0,x,y,al:double);
  41.       procedure cerchio(xc,yc,r:double);
  42.       procedure ellisse(xc,yc,rx,ry:double);
  43.       procedure linea(c:finestra);
  44.       procedure linea(a,b,c,d:double);
  45.       procedure lineaTo(x,y:double);
  46.       procedure parabola(a,b,c:double);
  47.       procedure SetXY(pu:tpuntoxy);
  48.       procedure limitiFoglio(var x,y:smallint);
  49.       procedure scriviXY(messaggio:string; cx,cy:real);
  50.       property  tinta:integer read getColore write setColore;
  51. end; { fine classe punto }
  52.  
  53. const nero=black;
  54.       blu=blue;
  55.       verde=green;
  56.       ciano=cyan;
  57.       rosso=red;
  58.       magenta=magenta;
  59.       marrone=brown;
  60.       GrigioChiaro=LightGray;
  61.       GrigioScuro=DarkGray;
  62.       BluChiaro=LightBlue;
  63.       VerdeChiaro=LightGreen;
  64.       CianoChiaro=LightCyan;
  65.       RossoChiaro=LightRed;
  66.       MagentaChiaro=LightMagenta;
  67.       giallo=yellow;
  68.       bianco=white;
  69.  
  70.       lampeggio=blink; { solo per il testo }
  71.  
  72. implementation
  73.  
  74. function inizio_graf:boolean;
  75. var sg,ng,ec:smallint(*integer*);
  76.     ch:boolean;
  77. begin
  78.  sg:=detect;
  79.  ng:=0;
  80.  initgraph(sg, ng, '');
  81.  ec:=graphresult;
  82.  if ec=grok then
  83.  begin
  84.   ch:=true;
  85.   settextstyle(DefaultFont, HorizDir, 1);
  86.  end
  87.  else
  88.  begin
  89.   ch:=false;
  90.   writeln;
  91.   write('Errore grafico: ',grapherrormsg(ec));
  92.   repeat until keypressed;
  93.   writeln(' ',readkey);
  94.  end;
  95.  inizio_graf:=ch;
  96. end;
  97.  
  98. procedure assi;
  99. var finx,finy,sx,sy:word;
  100. begin
  101.  finx:=getmaxx;
  102.  finy:=getmaxy;
  103.  sx:=finx div 2;
  104.  sy:=finy div 2;
  105.  setcolor(7);
  106.  line(sx,0,sx-3,10);
  107.  line(sx,0,sx+3,10);
  108.  line(finx,sy,finx-10,sy-3);
  109.  line(finx,sy,finx-10,sy+3);
  110.  setcolor(15);
  111.  line(sx,0,sx,finy);
  112.  line(0,sy,finx,sy);
  113.  outtextxy(finx-10,sy-15,'x');
  114.  outtextxy(sx+10,0,'y');
  115. end;
  116.  
  117. procedure fine_graf(pausa:boolean);
  118. var tasto:char;
  119. begin
  120.  if pausa then
  121.  begin
  122.    tasto:=readkey;
  123.    writeln(tasto);
  124.  end;
  125.  closegraph;
  126. end;
  127.  
  128. function distanza(tratto:finestra):double;
  129. var dx,dy:double;
  130. begin
  131.  dx:=tratto.fine.px - tratto.inizio.px;
  132.  dy:=tratto.fine.py - tratto.inizio.py;
  133.  distanza:=sqrt(dx*dx + dy*dy);
  134. end;
  135.  
  136. constructor punto.inizio(a,b,c,d:double);  overload;
  137. var temp:finestra;
  138. begin
  139.  with temp do
  140.  begin
  141.   inizio.px:=a;
  142.   inizio.py:=b;
  143.   fine.px:=c;
  144.   fine.py:=d;
  145.  end;
  146.  inizio(temp);
  147. end;
  148.  
  149. constructor punto.inizio(g:finestra); overload;
  150. var dx,dy:double;
  151. begin
  152.  maxx:=GetMaxX;
  153.  maxy:=GetMaxY;
  154.  tinta:=7;
  155.  f:=g;
  156.  with f do
  157.  begin
  158.   dx:=fine.px-inizio.px;
  159.   dy:=fine.py-inizio.py;
  160.  end;
  161.  if abs(dx)<1e-23 then dx:=1e-23;
  162.  if abs(dy)<1e-23 then dy:=1e-23;
  163.  scale.px:=maxx/dx;
  164.  scale.py:=maxy/dy;
  165.  SetX(f.inizio.px);
  166.  SetY(f.inizio.py);
  167. end;
  168.  
  169. constructor punto.IsoInizio(cx0,cy0,cxf:double);
  170. var dx:double;
  171. begin
  172.  maxx:=GetMaxX;
  173.  maxy:=GetMaxY;
  174.  tinta:=7;
  175.  with f do
  176.  begin
  177.   inizio.px:=cx0;
  178.   fine.px:=cxf;
  179.   inizio.py:=cy0;
  180.   dx:=cxf-cx0;
  181.   if abs(dx)<1e-23 then
  182.   begin
  183.    dx:=1e-23;
  184.    fine.px:=inizio.px+dx;
  185.   end;
  186.   scale.px:=maxx/dx;
  187.   scale.py:=scale.px;
  188.   fine.py:=(maxy/scale.py)+inizio.py;
  189.   SetX(inizio.px);
  190.   SetY(inizio.py);
  191.  end;
  192. end;
  193.  
  194. destructor punto.DistruggiPunto;
  195. begin
  196.  { Distruttore }
  197. end;
  198.  
  199. procedure punto.assi(c:word);
  200. var cx0,cy0:longint;
  201. begin
  202.  with f do
  203.  begin
  204.   cx0:=round(scale.px*(0.0-f.inizio.px));
  205.   cy0:=maxy-round(scale.py*(0.0-f.inizio.py));
  206.  end;
  207.  SetColor(abs(c) mod 16);
  208.  if (cy0>=0) and (cy0<=maxy) then
  209.  begin
  210.   line(0, cy0, maxx, cy0); { asse x }
  211.  end;
  212.  if (cx0>=0) and (cx0<=maxx) then
  213.  begin
  214.   line(cx0, 0, cx0, maxy); { asse y }
  215.  end;
  216.  setColor(colore);
  217. end;
  218.  
  219. procedure punto.SetX(a:double);
  220. begin
  221.  a:=scale.px*(a-f.inizio.px);
  222.  if a<0.0 then
  223.    a:=0.0;
  224.  if a>maxx then a:=maxx;
  225.  px:=round(a);
  226. end;
  227.  
  228. procedure punto.SetY(a:double);
  229. begin
  230.  a:=maxy-(scale.py*(a-f.inizio.py));
  231.  if a<0 then
  232.    a:=0.0;
  233.  if a>maxy then
  234.    a:=maxy;
  235.  py:=round(a);
  236. end;
  237.  
  238. procedure punto.SetXY(pu:tpuntoxy);
  239. begin
  240.  SetX(pu.px);
  241.  SetY(pu.py);
  242. end;
  243.  
  244. procedure punto.punto(x,y:double);
  245. begin
  246.  SetX(x);
  247.  SetY(y);
  248.  putpixel(px, py, colore);
  249. end;
  250.  
  251. procedure punto.rettangolo(x,y,x1,y1:double);
  252. var lato:finestra;
  253. begin
  254.  with lato do
  255.  begin
  256.   inizio.px:=x;
  257.   inizio.py:=y;
  258.   fine.px:=x1;
  259.   fine.py:=y;
  260.   linea(lato);
  261.   inizio.px:=x1;
  262.   fine.py:=y1;
  263.   linea(lato);
  264.   inizio.px:=x;
  265.   inizio.py:=y1;
  266.   linea(lato);
  267.   fine.px:=x;
  268.   fine.py:=y;
  269.   linea(lato);
  270.  end;
  271. end;
  272.  
  273. function punto.RuotaPunto(po:tpuntoxy; al:double):tpuntoxy;
  274. var ris:tpuntoxy;
  275. begin
  276.  ris.px:=po.px*cos(al)-po.py*sin(al);
  277.  ris.py:=po.px*sin(al)+po.py*cos(al);
  278.  RuotaPunto:=ris;
  279. end;
  280.  
  281. procedure punto.TraslaRuotaPunto(x0,y0,x,y,al:double);
  282. var rx,ry:double;
  283. begin
  284.  rx:=x*cos(al)-y*sin(al);
  285.  ry:=y*sin(al)+x*cos(al);
  286.  punto(rx+x0, ry+y0);
  287. end;
  288.  
  289. procedure punto.cerchio(xc,yc,r:double);
  290. var al,dal,omega:double;
  291. begin
  292.  al:=0.0;
  293.  omega:=2.0*pi;
  294.  if abs(r)<1e-15 then r:=1e-15;
  295.  dal:=1.0/(r*omega*scale.px);
  296.  setX(xc+r); sety(yc);
  297.  while al<=omega do
  298.  begin
  299.   lineaTo(xc+r*cos(al),  yc+r*sin(al));
  300.   al:=al+dal;
  301.  end;
  302. end;
  303.  
  304. procedure punto.linea(c:finestra);
  305. var x1,y1:integer;
  306. begin
  307.  with c do
  308.  begin
  309.   SetXY(inizio);
  310.   x1:=px;
  311.   y1:=py;
  312.   SetXY(fine);
  313.   setColor(colore);
  314.   line(x1, y1, px, py);
  315.  end;
  316. end;
  317.  
  318. procedure punto.linea(a,b,c,d:double);
  319. var t:finestra;
  320. begin
  321.  with t do
  322.  begin
  323.   inizio.px:=a;
  324.   inizio.py:=b;
  325.   fine.px:=c;
  326.   fine.py:=d;
  327.  end;
  328.  linea(t);
  329. end;
  330.  
  331. procedure punto.lineaTo(x,y:double);
  332. var ox,oy:word;
  333. begin
  334.  ox:=px;
  335.  oy:=py;
  336.  SetX(x);
  337.  SetY(y);
  338.  setColor(colore);
  339.  line(px,py, ox,oy);
  340. end;
  341.  
  342. procedure punto.ellisse(xc,yc,rx,ry:double);
  343. var al,dal,be,rm:double;
  344. begin
  345.  al:=0.0;
  346.  be:=2.0*pi;
  347.  rm:=0.5*(rx+ry);
  348.  dal:=0.5/(scale.py*be*rm);
  349.  while al<=be do
  350.  begin
  351.   punto(xc+rx*cos(al), yc+ry*sin(al));
  352.   al:=al+dal;
  353.  end;
  354. end;
  355.  
  356. procedure punto.parabola(a,b,c:double);
  357. var tratto:finestra;
  358.     passo:double;
  359.  
  360.  function fun(x:double):double;
  361.  begin
  362.    fun:=a*x*x + b*x + c;
  363.  end;
  364.  
  365. begin
  366.  passo:=(f.fine.px-f.inizio.px)/2000;
  367.  tratto.inizio.px:=f.inizio.px;
  368.  tratto.inizio.py:=fun(tratto.inizio.px);
  369.  while tratto.inizio.px<=f.fine.px do
  370.  begin
  371.    tratto.fine.px:=tratto.inizio.px + passo;
  372.    tratto.fine.py:=fun(tratto.fine.px);
  373.    linea(tratto);
  374.    tratto.inizio:=tratto.fine;
  375.  end;
  376. end;
  377.  
  378. procedure punto.setColore(c:integer);
  379. begin
  380.  colore:=abs(c) mod 16;
  381.  setColor(colore);
  382. end;
  383.  
  384. function  punto.getColore:integer;
  385. begin
  386.   getColore:=colore;
  387. end;
  388.  
  389. procedure punto.limitiFoglio(var x,y:smallint);
  390. begin
  391.  x:=maxx;
  392.  y:=maxy;
  393. end;
  394.  
  395. procedure punto.scriviXY(messaggio:string; cx,cy:real);
  396. begin
  397.  setX(cx);
  398.  setY(cy);
  399.  outTextXY(px, py, messaggio);
  400. end;
  401.  
  402.  
  403. begin
  404.  {Inizializzazione}
  405. end.