REM file to create "hex paving" of various heights for VIVID
S = 1.5: REM length of side
CS = S * .8660254: REM centre to side distance
NX = 4: REM number of hexagons in the X direction
NY = 4: REM number of hexagons in the Y direction
IX = 0: IY = 0: REM start position
DIM B(NX * NY + 1, 3): REM block number array, (x,y,z centre locations)
LC = 0: REM initialise last row pointer

FOR C = 1 TO NX * NY STEP NX
IF LC > 0 THEN B(C, 2) = B(LC, 2) + (2 * CS): REM set start of new row
LC = C
FOR D = 1 TO NX - 1
B(D + C, 1) = B(D + C - 1, 1) + (S * 3 / 2)
B(D + C, 2) = B(D + C - 1, 2) + CS
NEXT D
NEXT C: REM start of each row set ...
FOR C = 1 TO NX * NY
B(C, 3) = .1 + (RND(1) * S)
NEXT C
FOR C = 1 TO NX * NY
GOSUB DOONE:
NEXT C
SYSTEM

DOONE:
PRINT "polygon {"
PRINT "points 6"
X = B(C, 1): Y = B(C, 2): Z = B(C, 3)
PRINT "vertex "; X - S / 2; " "; Y + CS; " "; Z
PRINT "vertex "; X + S / 2; " "; Y + CS; " "; Z
PRINT "vertex "; X + S; " "; Y; " "; Z
PRINT "vertex "; X + S / 2; " "; Y - CS; " "; Z
PRINT "vertex "; X - S / 2; " "; Y - CS; " "; Z
PRINT "vertex "; X - S; " "; Y; " "; Z
PRINT "}"
PRINT
X1 = X - S / 2: Y1 = Y + CS
X2 = X + S / 2: Y2 = Y + CS
GOSUB DOEACH:
X1 = X + S / 2: Y1 = Y + CS
X2 = X + S: Y2 = Y
GOSUB DOEACH:
X1 = X + S: Y1 = Y
X2 = X + S / 2: Y2 = Y - CS
GOSUB DOEACH:
X1 = X + S / 2: Y1 = Y - CS
X2 = X - S / 2: Y2 = Y - CS
GOSUB DOEACH:
X1 = X - S / 2: Y1 = Y - CS
X2 = X - S: Y2 = Y
GOSUB DOEACH:
X1 = X - S: Y1 = Y
X2 = X - S / 2: Y2 = Y + CS
GOSUB DOEACH:
RETURN

DOEACH:
PRINT "polygon {"
PRINT "points 4"
PRINT "vertex "; X1; " "; Y1; " "; Z
PRINT "vertex "; X2; " "; Y2; " "; Z
PRINT "vertex "; X2; " "; Y2; " "; 0
PRINT "vertex "; X1; " "; Y1; " "; 0
PRINT "}"
PRINT

RETURN

FOR T = 1 TO NX * NY
PRINT T, B(T, 1), B(T, 2)
NEXT T

PRINT : PRINT
END

