RosettaCodeData/Task/Mandelbrot-set/Simula/mandelbrot-set.simula
2023-07-01 13:44:08 -04:00

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;