{exemplo de um circulo, por Brain Power / Darkness Unknown Force - 12-9-96}
{codigo documentado para fazer uns circulos fixes usando rapidas tabelas
 sinusoidais precalculadas}

uses mode13h,crt;

const raio = 40;   {raio do circulo - X e Y}
      base = 256;  {usamos uma base de 256, para, em ASM, ser mais facil
                    optimizar! Para as divisoes, em vez de DIVs temos
                    <numero> SHR 8, o que poupa muitos ciclos.
                    E esta a vantagem de fazer conversoes da base 360 (onde
                    pensamos) para as q da mais jeito ao comp. vai dar tudo
                    ao mesmo, soh q eh + rahpido! :) }

var i: Word;
    sintable, costable : array [0..360] of Integer;


begin

initgraph;

for i := 0 to base do SinTable[i] := Round(Sin(2*Pi*i/base) * Raio);
for i := 0 to base do CosTable[i] := Round(Cos(2*Pi*i/base) * Raio);

repeat
for i := 0 to base do
  begin
    putpixel(160+sintable[(i+(90*base div 360)) MOD base], 100+sintable[i], 9,vga);
    putpixel(160+sintable[(i+(90*base div 360)+1) MOD base], 100+sintable[i+1], 0,vga);
    putpixel(160+sintable[(i+(90*base div 360)-1) MOD base], 100+sintable[i-1], 0,vga);

    putpixel(160+sintable[(i+(90*base div 360)) MOD base], 150, 9,vga);
    putpixel(160+sintable[(i+(90*base div 360)) MOD base]+1, 150, 0,vga);
    putpixel(160+sintable[(i+(90*base div 360)) MOD base]-1, 150, 0,vga);

    putpixel(110, 100+sintable[i], 9,vga);
    putpixel(110, 100+sintable[i]+1, 0,vga);
    putpixel(110, 100+sintable[i]-1, 0,vga);

    waitvbl;
    if keypressed then i := base;
  end;
until keypressed;

closegraph;

end.
