Bulge

- optical illusion

The square grid distorts and appears to bulge outwards.
Three sets of grid tiles are drawn, background light and dark squares, black or white dots and foreground gray outline squares.
Try other even Order values from 2 to 12...

To New
  # set default screen, pen and turtle values
  ResetAll SetScreenSize [400 400] HideTurtle
  SetSC Black SetPC Green SetPS 1 PenUp
End

To GridSq :Order :Side
  # draw tile at each column x row position
  LocalMake "Offset (1+:Order)/2
  For (List "Col 1 :Order) [
    For (List "Row 1 :Order) [
      SetXY :Side*(:Col-:Offset) :Side*(:Row-:Offset)
      Tile :Col :Row :Side] ]
End

To Tile :Col :Row :Side
  # use global value of :Tile to draw selected tile
  Run (Word "Tile :Tile) :Col :Row :Side
End

To TileBg :Col :Row :Side
  If Even? (:Col+:Row) [SetPC [0 102 153]] [SetPC [153 204 255]]
  Square :Side-1 Fill Wait 2
End

To TileDot :Col :Row :Side
  If X>0 [Make "Col :Col+1]
  If Y>0 [Make "Row :Row+1]
  If Even? (:Col+:Row) [SetPC Black] [SetPC White]
  SetPW :Side/2 Dot Pos Wait 3
End

To TileSq :Col :Row :Side
  SetPC Gray SetPW :Side/30 Square :Side
End

To Square :Side
  # square (side x side) drawn from centre (tp)
  Back :Side/2 Right 90 Back :Side/2 PenDown
  Repeat 4 [
    Forward :Side Left 90]
  PenUp Forward :Side/2 Left 90 Forward :Side/2     # r2c
End

To Even? :Num
  # return 'true' if Num even, else return 'false'
  If (Mod :Num 2)=0 [Output "True] [Output "False]
End

To Go :Order
  New
  Make "Side Int (400/(:Order+1))
  GlobalMake "Tile "Bg GridSq :Order+1 :Side Wait 20
  GlobalMake "Tile "Dot GridSq :Order :Side Wait 20
  GlobalMake "Tile "Sq GridSq :Order-1 :Side
End

Bulge
Bulge

Procedures blue
Variables pink
Comments green
Library gray