85 lines
2.6 KiB
Text
85 lines
2.6 KiB
Text
BEGIN
|
|
REAL XCENTRE, YCENTRE, WIDTH, RMAX, XOFFSET, YOFFSET, PIXELSIZE;
|
|
INTEGER N, IMAX, JMAX, COLOURMAX;
|
|
TEXT FILENAME;
|
|
|
|
CLASS COMPLEX(RE,IM); REAL RE,IM;;
|
|
|
|
REF(COMPLEX) PROCEDURE ADD(A,B); REF(COMPLEX) A,B;
|
|
ADD :- NEW COMPLEX(A.RE + B.RE, A.IM + B.IM);
|
|
|
|
REF(COMPLEX) PROCEDURE SUB(A,B); REF(COMPLEX) A,B;
|
|
SUB :- NEW COMPLEX(A.RE - B.RE, A.IM - B.IM);
|
|
|
|
REF(COMPLEX) PROCEDURE MUL(A,B); REF(COMPLEX) A,B;
|
|
MUL :- NEW COMPLEX(A.RE * B.RE - A.IM * B.IM,
|
|
A.RE * B.IM + A.IM * B.RE);
|
|
|
|
REF(COMPLEX) PROCEDURE DIV(A,B); REF(COMPLEX) A,B;
|
|
BEGIN
|
|
REAL TMP;
|
|
TMP := B.RE * B.RE + B.IM * B.IM;
|
|
DIV :- NEW COMPLEX((A.RE * B.RE + A.IM * B.IM) / TMP,
|
|
(A.IM * B.RE - A.RE * B.IM) / TMP);
|
|
END DIV;
|
|
|
|
REF(COMPLEX) PROCEDURE RECTANGULAR(RE,IM); REAL RE,IM;
|
|
RECTANGULAR :- NEW COMPLEX(RE,IM);
|
|
|
|
REAL PROCEDURE MAGNITUDE(CX); REF(COMPLEX) CX;
|
|
MAGNITUDE := SQRT(CX.RE**2 + CX.IM**2);
|
|
|
|
BOOLEAN PROCEDURE INSIDEP(Z); REF(COMPLEX) Z;
|
|
BEGIN
|
|
BOOLEAN PROCEDURE INSIDE(Z0,Z,N); REAL N; REF(COMPLEX) Z,Z0;
|
|
INSIDE := MAGNITUDE(Z) < RMAX
|
|
AND THEN N = 0 OR ELSE INSIDE(Z0, ADD(Z0,MUL(Z,Z)), N-1);
|
|
INSIDEP := INSIDE(Z, NEW COMPLEX(0,0), N);
|
|
END INSIDEP;
|
|
|
|
INTEGER PROCEDURE BOOL2INT(B); BOOLEAN B;
|
|
BOOL2INT := IF B THEN COLOURMAX ELSE 0;
|
|
|
|
INTEGER PROCEDURE PIXEL(I,J); INTEGER I,J;
|
|
PIXEL := BOOL2INT(INSIDEP(RECTANGULAR(XOFFSET + PIXELSIZE * I,
|
|
YOFFSET - PIXELSIZE * J)));
|
|
PROCEDURE PLOT;
|
|
BEGIN
|
|
REF (OUTFILE) OUTF;
|
|
INTEGER J,I;
|
|
OUTF :- NEW OUTFILE(FILENAME);
|
|
OUTF.OPEN(BLANKS(132));
|
|
OUTF.OUTTEXT("P2"); OUTF.OUTIMAGE;
|
|
OUTF.OUTINT(IMAX,0); OUTF.OUTIMAGE;
|
|
OUTF.OUTINT(JMAX,0); OUTF.OUTIMAGE;
|
|
OUTF.OUTINT(COLOURMAX,0); OUTF.OUTIMAGE;
|
|
FOR J := 1 STEP 1 UNTIL JMAX DO
|
|
BEGIN
|
|
FOR I := 1 STEP 1 UNTIL IMAX DO
|
|
BEGIN
|
|
OUTF.OUTINT(PIXEL(I,J),0);
|
|
OUTF.OUTIMAGE;
|
|
END;
|
|
END;
|
|
OUTF.CLOSE;
|
|
END PLOT;
|
|
|
|
XCENTRE := -0.5;
|
|
YCENTRE := 0.0;
|
|
WIDTH := 4.0;
|
|
IMAX := 800;
|
|
JMAX := 600;
|
|
N := 100;
|
|
RMAX := 2.0;
|
|
FILENAME :- "out.pgm";
|
|
COLOURMAX := 255;
|
|
PIXELSIZE := WIDTH / IMAX;
|
|
XOFFSET := XCENTRE - (0.5 * PIXELSIZE * (IMAX + 1));
|
|
YOFFSET := YCENTRE + (0.5 * PIXELSIZE * (JMAX + 1));
|
|
|
|
OUTTEXT("OUTPUT WILL BE WRITTEN TO ");
|
|
OUTTEXT(FILENAME);
|
|
OUTIMAGE;
|
|
|
|
PLOT;
|
|
END;
|