REM +-------------------------------------+
REM | |
REM | "Imaginary Dots" optical illusion |
REM | |
REM +-------------------------------------+
REM Disable the Escape key
REM (or rather, prevent it from causing a trappable error if pressed)
*ESC OFF
ON ERROR PROCError : QUIT
REM Setup a full screen display
GWL_STYLE = -16
HWND_TOPMOST = -1
WS_VISIBLE = &10000000
WS_CLIPCHILDREN = &2000000
WS_CLIPSIBLINGS = &4000000
SYS "GetSystemMetrics", 0 TO xscreen%
SYS "GetSystemMetrics", 1 TO yscreen%
SYS "SetWindowLong", @hwnd%, GWL_STYLE, WS_VISIBLE + \
\ WS_CLIPCHILDREN + WS_CLIPSIBLINGS
SYS "SetWindowPos", @hwnd%, HWND_TOPMOST, 0, 0, xscreen%, yscreen%, 0
VDU 26 : COLOUR 15,0,0,0 : CLS : OFF
REM Get the window width and height
REM (in this case, the variables xscreen% and yscreen% contain
REM the width and height, respectively, of the full screen)
WinW% = xscreen%
WinH% = yscreen%
REM Calculate some values
k% = 12
p = k%*PI
q = p/(WinW%-1)
REM Calculate the grid cell width and height
CellW% = WinW%/k%
CellH% = WinH%/k%
REM Draw a single grid cell
GCOL 1
*REFRESH OFF
FOR Y% = 0 TO CellH%-1
u = p*Y%/(WinH%-1)
FOR X% = 0 TO CellW%-1
REM Calculate the greyscale intensity (in the range 0 to 255)
I% = INT(255 * ABS(SINu * SIN(X%*q)))
COLOUR 1, I%, I%, I%
PLOT 2*X%, 2*Y%
NEXT
NEXT
REM Copy the grid cell to fill the entire program window/screen
FOR Y%=0 TO WinH% DIV CellH%
FOR X%=0 TO WinW% DIV CellW%
RECTANGLE 0, 0, 2*WinW%, 2*CellH% TO 2*X%*CellW%, 2*Y%*CellH%
NEXT
NEXT
*REFRESH
REM Exit when user presses Escape or some other key,
REM or clicks a mouse button
MOUSE OFF
*REFRESH ON
PROCWait
QUIT
DEF PROCWait
LOCAL B%, X%, Y%, quit%
REM Flush the keyboard buffer
*FX 21,0
quit% = FALSE
REPEAT
MOUSE X%, Y%, B%
IF INKEY(0)<>-1 OR B%<>0 THEN quit% = TRUE
WAIT 1 : REM A delay necessary to prevent 100% CPU usage :-)
UNTIL quit%
ENDPROC
DEF PROCError
*REFRESH ON
MOUSE ON : CLS : ON : VDU 7 : COLOUR 7 : PRINT '" ";
REPORT : PRINT " at line "; ERL
PRINT ''" Press a key or click a mouse button to exit";
PROCWait
ENDPROC
*ESC OFF
MODE 10 : OFF
COLOUR 7,148,148,148
ScrW%=@vdu%!208
ScrH%=@vdu%!212
S%=80 : REM grid spacing
T%=18 : REM grid line thickness
O%=S%DIV2 : REM grid origin offset
*REFRESH OFF
GCOL 7
FOR Y%=0 TO ScrH% STEP S%
FOR X%=0 TO ScrW% STEP S%
RECTANGLE FILL 2*(X%-O%), 0, 2*T%, 2*ScrH%
RECTANGLE FILL 0, 2*(Y%-O%), 2*ScrW%, 2*T%
NEXT
NEXT
GCOL 15
FOR Y%=0 TO ScrH% STEP S%
FOR X%=0 TO ScrW% STEP S%
K% = O% - T%DIV2
CIRCLE FILL 2*(X%-K%), 2*(Y%-K%), 2*0.8*T%
NEXT
NEXT
*REFRESH
*REFRESH ON
REPEAT UNTIL INKEY(1)=0