62 lines
2.1 KiB
Text
62 lines
2.1 KiB
Text
using Gtk, Colors, Cairo
|
|
|
|
function CodepenApp()
|
|
# left-top, top-right, right-bottom, bottom-left
|
|
LT, TR, RB, BL = 1, 2, 3, 4
|
|
edges = [
|
|
[LT, BL, BL, RB, RB, TR, TR, LT, LT, BL, BL, RB],
|
|
[LT, LT, BL, BL, RB, RB, TR, TR, LT, LT, BL, BL],
|
|
[TR, LT, LT, BL, BL, RB, RB, TR, TR, LT, LT, BL],
|
|
[TR, TR, LT, LT, BL, BL, RB, RB, TR, TR, LT, LT],
|
|
[RB, TR, TR, LT, LT, BL, BL, RB, RB, TR, TR, LT],
|
|
[RB, RB, TR, TR, LT, LT, BL, BL, RB, RB, TR, TR],
|
|
[BL, RB, RB, TR, TR, LT, LT, BL, BL, RB, RB, TR],
|
|
[BL, BL, RB, RB, TR, TR, LT, LT, BL, BL, RB, RB],
|
|
[LT, BL, BL, RB, RB, TR, TR, LT, LT, BL, BL, RB],
|
|
[LT, LT, BL, BL, RB, RB, TR, TR, LT, LT, BL, BL],
|
|
[TR, LT, LT, BL, BL, RB, RB, TR, TR, LT, LT, BL],
|
|
[TR, TR, LT, LT, BL, BL, RB, RB, TR, TR, LT, LT]]
|
|
W, B = colorant"white", colorant"darkgray"
|
|
colors = [
|
|
[W, B, B, W],
|
|
[W, W, B, B],
|
|
[B, W, W, B],
|
|
[B, B, W, W]]
|
|
win = GtkWindow("Peripheral drift illusion", 230, 230) |> (can = GtkCanvas())
|
|
@guarded draw(can) do widget
|
|
ctx = Gtk.getgc(can)
|
|
function line(x1, y1, x2, y2, colr)
|
|
set_source(ctx, colr)
|
|
move_to(ctx, x1, y1)
|
|
line_to(ctx, x2, y2)
|
|
stroke(ctx)
|
|
end
|
|
set_source(ctx, colorant"yellow")
|
|
rectangle(ctx, 0, 0, 250, 250)
|
|
fill(ctx)
|
|
set_line_width(ctx, 2)
|
|
for x in 1:12
|
|
px = 18 + x * 14
|
|
for y in 1:12
|
|
py = 18 + y * 14
|
|
set_source(ctx, colorant"skyblue")
|
|
rectangle(ctx, px, py, 10, 10)
|
|
fill(ctx)
|
|
carray = colors[edges[y][x]]
|
|
line(px, py, px + 9, py, carray[1])
|
|
line(px + 9, py, px + 9, py + 9, carray[2])
|
|
line(px + 9, py + 9, px, py + 9, carray[3])
|
|
line(px, py + 9, px, py, carray[4])
|
|
end
|
|
end
|
|
end
|
|
showall(win)
|
|
draw(can)
|
|
condition = Condition()
|
|
endit(w) = notify(condition)
|
|
signal_connect(endit, win, :destroy)
|
|
showall(win)
|
|
wait(condition)
|
|
end
|
|
|
|
CodepenApp()
|