program frac; { This program was stripped down a bit while I wrote and tested } { the graphics driver. The code is here to enable zooming and } { shifting around the image. You need only implement the calls } { to use it. The .COM file included in PCPIGRAF.LBR was compiled } { with memtop at $C000, so it will run on almost every system. } { -Rod Pederson } Const ScrnTop = 0; ScrnSid = 0; Var RealScale,ImagScale,CReal,CImag,ZReal,ZImag : real; LowReal,HiReal,temp,LowImag,HiImag : real; ScrnWid, ScrnDep : integer; Colr,MaxExp,MaxCount,ScrnX,ScrnY : integer; ColourScale : integer; Lframe,Rframe,Tframe,Bframe,Hframe,Vframe : integer; BoxSid, BoxTop : integer; pictures : integer; ch : char; DoFractal : boolean; {$Idhr.inc} procedure init (CScale, MExp, SWid, SDep : integer); begin ColourScale := CScale; MaxExp := MExp; MaxCount := Round(exp(2*ln(MaxExp))); ScrnWid := SWid; ScrnDep := SDep; ScrnX := ScrnWid; ScrnY := ScrnDep; end; procedure scaleit; begin RealScale := (HiReal - LowReal)/ScrnWid; ImagScale := (HiImag - LowImag)/ScrnDep; end; procedure moveleft; begin temp := (HiReal - LowReal) / ScrnWid; LowReal := LowReal + temp; HiReal := HiReal + temp; Vframe := Vframe + 1; scaleit; end; procedure moveright; begin temp := (HiReal - LowReal) / ScrnWid; LowReal := LowReal - temp; HiReal := HiReal - temp; Vframe := Vframe - 1; scaleit; end; procedure movedown; begin temp := (HiImag - LowImag) / ScrnDep; LowImag := LowImag - temp; HiImag := HiImag - temp; Hframe := Hframe - 1; scaleit; end; procedure moveup; begin temp := (HiImag - LowImag) / ScrnDep; LowImag := LowImag + temp; HiImag := HiImag + temp; Hframe := Hframe + 1; scaleit; end; procedure zoomin; begin temp := (HiImag - LowImag) / ScrnDep; LowImag := LowImag + temp; HiImag := HiImag - temp; temp := (HiReal - LowReal) / ScrnWid; LowReal := LowReal + temp; HiReal := HiReal - temp; BoxSid := BoxSid - 1; BoxTop := BoxTop - 1; scaleit; end; procedure zoomout; begin temp := (HiImag - LowImag) / ScrnDep; LowImag := LowImag - temp; HiImag := HiImag + temp; temp := (HiReal - LowReal) / ScrnWid; LowReal := LowReal - temp; HiReal := HiReal + temp; BoxSid := BoxSid + 1; BoxTop := BoxTop + 1; scaleit; end; procedure point; begin Colr := 0; ZReal := 0; ZImag := 0; while ((Colr= 0) and ( X <= 139) and (Y >= 0) and (Y <= 191)) then cplot (X,Y,C); end; procedure doit (caller : integer); Var go : boolean; begin go := True; while go do begin ScrnY := 0; while (ScrnY < ScrnDep) and (go) do begin ScrnX := 0; while (ScrnX < ScrnWid) and (go) do begin CReal := LowReal + RealScale * ScrnX; CImag := HiImag - ImagScale * ScrnY; point; plotit; ScrnX := ScrnX + 1; if KeyPressed then begin if caller = 1 then DoFractal := False; go := False; end end; ScrnY := ScrnY + 1; end; end; end; begin LowReal := -2; HiReal := 0.5; LowImag := -1.25; HiImag := 1.25; init (15, 7, 139, 191); Lframe := ScrnSid; Rframe := ScrnWid + ScrnSid; Bframe := ScrnTop; Tframe := ScrnDep + ScrnTop; Vframe := ScrnSid + ScrnWid div 2; Hframe := ScrnTop + ScrnDep div 2; BoxSid := ScrnDep div 2 + ScrnTop; BoxTop := ScrnDep div 2 + ScrnTop; scaleit; pictures := 0; DoFractal := True; grafmode(colour); grafix; clrgraf($00); while (DoFractal) do begin doit (1); end; while not KeyPressed do; text; ClrScr; writeln ('Done.'); end.