home *** CD-ROM | disk | FTP | other *** search
- Program Mandelbrot;
- {$U-}
-
- type
- Special = String[23];
-
- chunk = record
- Val1:Special;
- Val2:Special;
- Val3:Special;
- Val4:Special;
- littlechunk : array[0..319,0..199] of byte;
- end;
-
- Const
-
- Beep :Char = ^G;
-
- var
-
- XPic,YPic,Color :Integer;
- RealUpper,RealLower,ImagUpper,ImagLower :Real;
- Name :string[20];
- N : byte;
- chunkfile : file of chunk;
- ChunkRec : Chunk;
- c,choice : char;
-
- Procedure Generate;
-
- var
-
- RealPart,Imaginary,ZR,ZI,StepX,StepY,ZrSquared,ZISquared :Real;
-
- Begin
-
- Writeln('Enter Lower and upper limits of Real & Imaginary parts');
- Writeln('as:RL,RU,IL,IU each followed by a CR.');
- Readln(RealLower);
- Readln(RealUpper);
- Readln(ImagLower);
- readln(ImagUpper);
- Writeln('Enter filename:');
- Readln(Name);
- GraphColorMode;
- StepX:=(RealUpper-RealLower)/320.0;
- StepY:=(ImagUpper-ImagLower)/200.0;
- For Xpic := 0 to 319 do
- Begin
- For Ypic := 0 to 199 do
- Begin
- N:=0;
- ZR:=0;
- ZI:=0;
- Plot(XPic-1,YPic-1,3);
- RealPart:=RealLower+Int(Xpic)*Stepx;
- Imaginary:=ImagLower+Int(Ypic)*StepY;
- ZrSquared:=0;
- ZISquared:=0;
- repeat
- ZI:=ZI*ZR*2+imaginary;
- Zr:=ZrSquared+REALPart-ZISquared;
- N:=N+1;
- ZrSquared:=Sqr(Zr);
- ZISquared:=Sqr(ZI);
- Until ((ZrSquared+ZISquared)>4) or (N>254);
- Color:=3-(N shr 6); {make 0 to 255 into 15 to 0 for graphing}
- Plot(XPic-1,Ypic-1,Color);
- ChunkRec.LittleChunk[xpic,ypic]:=n;
- End;
- if keypressed then
- Begin
- Read(Kbd,c);
- if c = Chr(3) then halt;
- end;
- End;
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Write(beep); {Beep at finish}
- Read(Kbd,c);
- TextMode;
- Str(RealLower:23,ChunkRec.Val1);
- Str(RealUpper:23,ChunkRec.Val2);
- Str(ImagLower:23,ChunkRec.Val3);
- Str(ImagUpper:23,ChunkRec.Val4);
- Assign(chunkfile,Name);
- Rewrite(chunkfile);
- Write(chunkfile,ChunkRec);
- Close(chunkfile);
- Write(beep);
- End;
-
- Procedure Print;
-
- var
-
- RealUpper,RealLower,ImagUpper,ImagLower :Real;
- N :Byte;
- z :String[10];
- Breakpoint1,Breakpoint2,EPosition,Palet,error :Integer;
-
- Function Value(numstring: Special) : Real;
-
- var
- temporary : real;
-
- Begin
- If Numstring[21]='0' then delete(numstring,21,1); {If written by 8087 version}
- Repeat
- Delete(numstring,1,1);
- until Ord(NumString[1])<>32; {delete spaces}
- Val(NumString,temporary,error);
- Value := temporary;
- End;
-
- Begin
- Writeln('Enter Filename for data');
- Readln(Name);
- Assign(Chunkfile,Name);
- Reset(Chunkfile);
- Read(Chunkfile,ChunkRec);
- Close(ChunkFile);
- RealLower:=Value(ChunkRec.Val1);
- RealUpper:=Value(ChunkRec.Val2);
- ImagLower:=Value(ChunkRec.Val3);
- ImagUpper:=Value(ChunkRec.Val4);
- Writeln('Real Boundries are: ',RealLower:10:8,' ',RealUpper:10:8);
- WriteLn('Imaginary Boundries: ',ImagLower:10:8,' ',ImagUpper:10:8);
- Writeln('255 will be black, Enter breakpoints for other two shades');
- Readln(Breakpoint1);
- Readln(Breakpoint2);
- Writeln('When display is complete enter a "P" to change palettes or');
- Writeln('any other character to exit. Enter return to display plot');
- Read(z);
- GraphcolorMode;
- For Xpic := 0 to 319 do
- Begin
- For Ypic := 0 to 199 do
- Begin
- N:=ChunkRec.LittleChunk[xpic,ypic];
- If N=255 then Color := 0
- else
- If N<Breakpoint1 then Color := 3
- else
- If (N<Breakpoint2) then Color := 2
- else Color := 1;
- Plot(XPic,Ypic,Color);
- End;
- End;
- Palet := 0;
- repeat
- read(kbd,c); {wait for an entry before erasing screen}
- Palet := (Palet+1) AND 3;
- If UpCase(c) = 'P' then Palette(Palet);
- Until Upcase(c) <> 'P';
- textmode;
- End;
-
- Begin
- Repeat
- ClrScr;
- Write('(C)reate a Mandelbrot file, (D)isplay a file or (E)xit ? ');
- Repeat Read(kbd,choice) until UpCase(choice) in['C','D','E'];
- Writeln;
- Case Choice of
- 'c','C' :Generate;
- 'd','D' :Print;
- end;
- until UpCase(choice) = 'E';
- end.