begin
comment
THE SERPINSKI (SP?) CURVE. A SIMPLE DEMO...
;
integer N, H0;
N := 2; comment RECURSION DEEP ;
H0 := 32; comment 'WINDOW' WIDTH / HEIGHT (POWER OF 2) ;
begin
integer I, H, X, Y, X0, Y0;
integer PENY, PENX;
boolean array SCR [0 : H0, 0 : H0];
procedure SERP;
begin
I := 0; H := H0 / 4;
X0 := 2 * H; Y0 := 3 * H;
DOLOOP:
I := I + 1;
X0 := X0 - H;
H := H / 2;
Y0 := Y0 + H;
X := X0;
Y := Y0;
SETPEN;
A (I); X := X + H; Y := Y - H; MOVEPEN;
B (I); X := X - H; Y := Y - H; MOVEPEN;
C (I); X := X - H; Y := Y + H; MOVEPEN;
D (I); X := X + H; Y := Y + H; MOVEPEN;
if I < N then
goto DOLOOP
end;
procedure A (I);
value I;
integer I;
begin
if I > 0 then begin
A (I-1); X := X + H; Y := Y - H; MOVEPEN;
B (I-1); X := X + 2 * H; MOVEPEN;
D (I-1); X := X + H; Y := Y + H; MOVEPEN;
A (I-1)
end
end;
procedure B (I);
value I;
integer I;
begin
if I > 0 then begin
B (I-1); X := X - H; Y := Y - H; MOVEPEN;
C (I-1); Y := Y - 2 * H; MOVEPEN;
A (I-1); X := X + H; Y := Y - H; MOVEPEN;
B (I-1)
end
end;
procedure C (I);
value I;
integer I;
begin
if I > 0 then begin
C (I-1); X := X - H; Y := Y + H; MOVEPEN;
D (I-1); X := X - 2 * H; MOVEPEN;
B (I-1); X := X - H; Y := Y - H; MOVEPEN;
C (I-1)
end
end;
procedure D (I);
value I;
integer I;
begin
if I > 0 then begin
D (I-1); X := X + H; Y := Y + H; MOVEPEN;
A (I-1); Y := Y + 2 * H; MOVEPEN;
C (I-1); X := X - H; Y := Y + H; MOVEPEN;
D (I-1)
end
end;
procedure SETPEN;
begin
PENX := X;
PENY := Y
end;
procedure XLINE (Y, X, DX);
value Y, X, DX; integer Y, X, DX;
begin
integer I;
for I := 0 step 1 until DX do
SCR [Y, X + I] := true
end;
procedure YLINE (X, Y, NY);
value X, Y, NY; integer X, Y, NY;
begin
integer J;
for J := 0 step 1 until NY do
SCR [Y + J, X] := true
end;
procedure DRLINE (Y1, X1, Y2, X2);
value Y1, X1, Y2, X2; integer Y1, X1, Y2, X2;
begin
integer I, J, DX, DY;
real SY, SX, Y, X;
DY := Y2 - Y1; DX := X2 - X1;
if ABS (DY) > ABS (DX) then begin
SY := SIGN (DY);
SX := SIGN (DX) * ABS (DX / DY)
end
else begin
SY := SIGN (DY) * ABS (DY / DX);
SX := SIGN (DX)
end;
Y := Y1; X := X1;
DOLOOP:
SCR [Y, X] := true;
Y := Y + SY; X := X + SX;
if (Y1 <= Y2 and Y <= Y2)
or (Y1 >= Y2 and Y >= Y2)
or (X1 <= X2 and X <= X2)
or (X1 >= X2 and X >= X2) then goto DOLOOP
end;
procedure MOVEPEN;
begin
integer procedure MIN (X, Y);
value X, Y; integer X, Y;
if X < Y then MIN := X
else MIN := Y;
if PENX = X then
YLINE (X, MIN (Y, PENY), ABS (Y - PENY))
else if PENY = Y then
XLINE (Y, MIN (X, PENX), ABS (X - PENX))
else
DRLINE (PENY, PENX, Y, X);
PENX := X;
PENY := Y
end;
comment
THIS IS THE MAIN PROGRAM:
;
begin
integer I, J;
comment CLEANUP THE SCREEN ;
for J := 0 step 1 until H0 do
for I := 0 step 1 until H0 do
SCR [J, I] := false;
SERP;
comment PRINT THE SCREEN ;
for J := 0 step 1 until H0 do begin
for I := 0 step 1 until H0 do
if SCR [J, I] then
WRITE ("##")
else
WRITE (" ");
OUTSYMBOL (1, "\N", 0)
end
end
end
end