'===========================================================================
' Subject: DRAW A HILBERT CURVE               Date: 11-02-96 (18:32)       
'  Author: Jamshid Khoshrangi                 Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: EGAVGA.ABC
'===========================================================================
'    HILBERT.BAS   --  Program to draw a Hilbert Curve
'
'    Translated from Dr. Roger T. Steven's C sample
'    code in _Fractal Programming in C_ pp. 199-200.
'
'    Courtesy JAMSHID KHOSHRANGI
'    Modified slightly by Andrew Dart

DEFINT A-Z
DECLARE SUB generate (r1 AS INTEGER, r2 AS INTEGER)

DIM Temp AS INTEGER
DIM SHARED level AS INTEGER
DIM r AS INTEGER
DIM SHARED x1 AS INTEGER
DIM SHARED y1 AS INTEGER
DIM SHARED x2 AS INTEGER
DIM SHARED y2 AS INTEGER
DIM SHARED WhatColor AS INTEGER

SCREEN 12
CLS
DO
   x1 = 140
   y1 = 60
   x2 = 140
   y2 = 60

   level = 7
   generate 3, 0
LOOP
END

SUB generate (r1 AS INTEGER, r2 AS INTEGER)
SHARED Governor

level = level - 1

IF level > 0 THEN
   generate r2, r1
END IF
x2 = x2 + r1
y2 = y2 + r2
LINE (x1, y1)-(x2, y2), WhatColor
x1 = x2
y1 = y2
IF level > 0 THEN
     generate r1, r2
END IF
x2 = x2 + r2
y2 = y2 + r1
LINE (x1, y1)-(x2, y2), WhatColor
x1 = x2
y1 = y2
IF level > 0 THEN
     generate r1, r2
END IF
x2 = x2 - r1
y2 = y2 - r2
LINE (x1, y1)-(x2, y2), WhatColor
x1 = x2
y1 = y2
IF level > 0 THEN
     generate -r2, -r1
END IF

level = level + 1

IF level > 3 THEN
   i$ = INKEY$
   IF i$ = CHR$(27) THEN END
END IF
IF level > 2 THEN
   WhatColor = 1 + INT(TIMER MOD 15)
END IF

END SUB
