program diagram; uses graph,crt; type pelement=^telement; telement=record data,source:integer; next:pelement; end; var list,curr,tmpcurr:pelement;allrec,gd,gm,rot,vp:integer; var kb: byte absolute $0000:$0417; procedure loaddata; var f:text;n,alld:integer;tmp:integer; begin assign(f,'c:\graph.txt'); reset(f); n:=0;alld:=0; readln(f,allrec); new(list); curr:=list; for n:=1 to allrec do begin readln(f,tmp); curr^.source:=tmp; alld:=alld+tmp; {writeln(n);} if n=allrec then curr^.next:=nil else begin new(curr^.next); curr:=curr^.next; end; end; alld :=360 div alld; writeln(alld); curr:=list; for n:=1 to allrec do begin curr^.data:=curr^.source*alld; curr:=curr^.next; end; end; function gr2r(grad:integer):real; var grad2:real; begin grad2:=grad*(3.1415/180); gr2r:=grad2; end; procedure drawdiagr(rotate:integer;tcolor,fil:integer); var n,gs,x1,y1,x2,y2,fc,lfc:integer;txt:string; begin curr:=list; gs:=rotate;fc:=0; setcolor(tcolor); for n:=1 to allrec do begin fc:=fc+1; {setfillstyle(1,fc); sector(320,240,gs,gs+curr^.data-10,210,210); } x1:=trunc(320+cos(gr2r(gs-1))*120); y1:=trunc(200+sin(gr2r(gs-1))*96); {x2:=trunc(320+cos(gr2r(gs+curr^.data+1))*200); y2:=trunc(240+sin(gr2r(gs+curr^.data+1))*200);} line(320,200,x1,y1); {line(320,240,x2,y2);} gs:=gs+curr^.data; curr:=curr^.next; end; circle(320,200,120); circle(320,200,123); fc:=1;gs:=rotate;curr:=list; for n:=1 to allrec do begin x1:=trunc(320+cos(gr2r(gs+(curr^.data div 2)))*60); y1:=trunc(200+sin(gr2r(gs+(curr^.data div 2)))*60); {line(320,240,x1,y1); } gs:=gs+curr^.data; fc:=fc+1; setfillstyle(1,fc); if fil=1 then floodfill(x1,y1,tcolor); if kb and 8 <> 8 then begin str(curr^.source,txt); settextstyle(5,0,2); outtextxy(x1-10,y1-10,txt); end; curr:=curr^.next; end; end; procedure disposelist; var n:integer; begin curr:=list;n:=0; while curr^.next<>nil do begin {n:=n+1;write(n);} tmpcurr:=curr; curr:=curr^.next; dispose(tmpcurr); end; dispose(curr); {readln;} end; begin loaddata; {readln;} vp:=0; gd:=4;gm:=1; initgraph (gd,gm,''); cleardevice; for rot:=1 to 144 do begin if vp=1 then vp:=0 else vp:=1; if vp=1 then begin setactivepage(0); setvisualpage(1); end; if vp=0 then begin setactivepage(1); setvisualpage(0); end; clearviewport; drawdiagr(rot*5,15,1); delay(5000); end; setvisualpage(0); disposelist; readln; closegraph; end.