home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
300-399
/
ff339.lzh
/
PCQ
/
Examples
/
Mandel.p
< prev
next >
Wrap
Text File
|
1990-03-19
|
5KB
|
173 lines
PROGRAM Mand;
{
Mandel.p is a Mandelbrot display program written by
Ralph Seguin, and included in the PCQ distribution with
his permission. I don't know what the real and imaginary
components represent, but the following values produce a
reasonable image:
Real component : 0.6
Imaginary comp : 0.15
Zoom size : 0.5
Iterations : more than, say, 40
}
{$I ":Include/Ports.i" So we can check the window message port. }
{$I ":Include/Intuition.i" for OpenWindow(), OpenScreen(), CloseWindow() and CloseScreen(). }
{$I ":Include/Graphics.i" for Draw() and Move() functions. }
{$I ":Include/Exec.i"}
VAR
H,V: INTEGER; { Horizontal and vertical looping coordinates. }
K: INTEGER; { Generic looping interger from Hell. FOR K rules! }
W: WindowPtr; { A pointer to our custom window after creation. }
S: ScreenPtr; { A pointer to our custom defined screen. }
RP: RastPortPtr; { a pointer to a rastport structure (record) so we can do plotting in a rastport (window). }
CR,CI,T: REAL; { Current real and imaginary and a temp real. }
ZR,ZI: REAL; { Z-real and imaginary coordinates. }
B: BOOLEAN; { Generic boolean from hell for loop breaking. }
MaxIter: INTEGER; { Maximum number of iterations to perform. }
RealC,ImgC,Zoom: REAL; { Coordinates for corner and zoom box size. }
HoriF,VertF: REAL; { Horizontal and Vertical Factors. }
PROCEDURE CleanExit(St:STRING; RC:INTEGER);
BEGIN
IF (W <> NIL) THEN
CloseWindow(W);
IF (S <> NIL) THEN
CloseScreen(S);
IF (GfxBase <> NIL) THEN
CloseLibrary(GfxBase);
WRITELN(St);
Exit(RC);
END; { CleanExit() }
PROCEDURE SetColors;
VAR
K: INTEGER;
VP: ADDRESS;
BEGIN
VP := ViewPortAddress(W);
FOR K := 0 TO 31 DO
SetRGB4(VP,K,K DIV 2,K MOD 2, K MOD 11); { Set color K to R,G,B values. }
END;
PROCEDURE Init;
CONST
NW: NewWindow = (0,19,320,380,1,7,CLOSEWINDOW_f,
WINDOWDRAG_f+WINDOWCLOSE_f+SMART_REFRESH_f+BORDERLESS_f+ACTIVATE_f,
NIL,NIL,"<-- Click me to stop",NIL,NIL,0,0,0,0,CUSTOMSCREEN_f);
NS: NewScreen = (0,0,320,400,5,1,7,4,CUSTOMSCREEN_f,NIL,
"SmallMandel, by Ralph Seguin, ESC Inc.",
NIL,NIL); { Our NewScreen structure }
BEGIN { Init }
GfxBase := OpenLibrary("graphics.library",0); { Open up the graphics.library. }
{ The graphics.library contains routines to do all the basic graphics, lines, }
{ circles, etc. If you plan to use any of these, it is necessary to open this }
{ Always remember to close a library after you are finished using it, otherwise }
{ you will make the system unsafe. }
IF (GfxBase = NIL) THEN
CleanExit("Mandel: Couldn't open graphics.library!",20);
S := OpenScreen(Adr(NS));
IF (S = NIL) THEN
CleanExit("Unable to open screen.",5);
NW.Screen := S; { We can't assign this dynamically }
W := OpenWindow(Adr(NW));
IF (W = NIL) THEN
CleanExit("Unable to open window.",5);
SetColors;
RP := W^.RPort; { Get a pointer to the rastport for the window we opened. }
{ A rastport is required to do any sort of graphics rendering. }
END; { Init }
BEGIN { Main }
WRITELN(" MandelHell 0.15, by Ralph Seguin.");
WRITELN;
WRITE("Enter real component: ");
READLN(RealC);
WRITE("Enter imaginary component: ");
READLN(ImgC);
WRITE("Enter zoom size: ");
READLN(Zoom);
WRITE("Maximum iteration count: ");
READLN(MaxIter);
Init; { Initialize globals }
HoriF := Zoom / 320.0;
VertF := Zoom / 380.0;
FOR V := 12 TO 380 DO BEGIN
CI := ImgC + VertF * Float(V);
FOR H := 1 TO 320 DO BEGIN
CR := HoriF * Float(H) + RealC;
ZR := 0.0;
ZI := 0.0;
B := TRUE;
K := 1;
WHILE ((K <= MaxIter) AND B) DO BEGIN
T := ZR;
ZR := Sqr(ZR) - Sqr(ZI) + CR;
ZI := 2.0 * T * ZI + CI;
K := SUCC(K);
IF (Sqr(ZR) + Sqr(ZI) >= 4.0) THEN
B := FALSE;
END; { WHILE (K <= 100 AND B) }
IF (K < MaxIter) THEN
SetAPen(RP,K MOD 31 + 1)
ELSE
SetAPen(RP,0);
Move(RP,H,V); { Move to this point in the Window (RastPort). }
Draw(RP,H,V); { Draw at this point. }
END; { FOR H := 1 TO 100 }
IF (CheckBreak() OR (GetMsg(W^.UserPort) <> NIL)) THEN BEGIN
WHILE (GetMsg(W^.UserPort) <> NIL) DO ;
CleanExit("Have a nice day.",0);
END;
END; { FOR V := 1 TO 80 }
if WaitPort(w^.UserPort) = Nil then;
WHILE (GetMsg(W^.UserPort) <> NIL) DO ;
CleanExit("Have a nice day.",0);
END. { Main }