J研究会資料 2005/9/24
Jで錯視グラフィックスをたのしむ
西川 利男
最近,朝日新聞の日曜版に「目の冒険,錯視の話」と題するおもしろい記事がのっている.7月31日には下のようなきれいな画面がのっていた.今回はこれをJのグラフィックスで再現しようというものである.
Jのisigraphを使ったグラフィックスについては,これまで何回も紹介してきた[1],[2].
これなどは単に図形を描くだけだが,練習問題としてかっこうのテーマであろう.
[1] 西川「Jできれいなグラフィックスを描こう」J研究会資料,2003/4/26
[2] 西川「Jによるフラクタル・グラフィックス」J研究会資料,2003/8/2
Jのグラフィックス・プログラミングでは,まずフォーム・エディタでウィンドウズ・フォームを設計する.グラフィックスモジュールとしてisigraphを選ぶ.次にコード部分をJでプログラミングする.
ここでは,次のような基本のグラフィックス命令が使われている.
wd 'grgb 255 0 255' RGB値による色の指定
wd 'gpen 1' ペンの太さを選ぶ
wd 'grect 0 0 1000 1000' (0,0)-(1000,1000)で長方形を描く
wd 'gbrush' ペンからブラッシュに変える
wd 'gfood 50 50 255 0 255' (50,50)の周りをRGB値の色で塗りつぶす
起動してすぐ現れる市松模様を描くルーチンも上のようなグラフィック命令を用いて.ここではBASIC流に繰り返しループでプログラムした.
OKボタンを押すと初めて錯視パターンが現れる.錯視のパターン値は
0 … 黒の十字, 1 … 白の十字, 2 … そのまま
上のような意味を持つ値から成る配列DAで示す.これに従い,市松模様の各隅に白黒の十字の印を付ける.
こんな簡単なしかけを加えただけで,目の錯覚を利用して,真ん中の部分だけが,周りから離れて別行動をとってまわり出すように見える.
プログラムリスト
NB. Illusion Graphics programmed by T.N. 2005/8/3
NB. 北岡明佳「錯視」,朝日新聞,2005/8/1
run =: illusion_run
NB. base form
ILLUSION=: 0 : 0
pc illusion closeok;
menupop "File";
menu new "&New" "" "" "";
menu open "&Open" "" "" "";
menusep ;
menu exit "&Exit" "" "" "";
menupopz;
xywh 176 8 34 12;cc ok button;cn "OK";
xywh 176 23 34 12;cc cancel button;cn "Exit";
xywh 8 8 161 143;cc mygraph isigraph;
pas 6 6;pcenter;
rem form end;
)
illusion_run=: 3 : 0
wd ILLUSION
NB. initialize form here
wd 'pshow;'
ichi_matu ''
)
illusion_cancel_button=: 3 : 0
wd 'pclose;'
)
N =: 15
KN =: 1000 % N
ichi_matu =: 3 : 0
wd 'grgb 255 0 255'
wd 'gpen 1'
wd 'grect 0 0 1000 1000'
wd 'gbrush'
wd 'gflood 50 50 255 0 255'
wd 'grgb 255 0 0'
wd 'gpen 10'
i =. 0
while. i < N+1 do.
Xi =. i * KN
if. 0 = 2|i do. j =. 0 else. j =. 1 end.
while. j < N+1 do.
Yj =. j * KN
NB. wd 'gellipse ', (": Xi),' ', (": Yj), ' 100 100' NB. mizu_tama
wd 'grect ', (": Xi),' ', (": Yj),' ',(": KN),' ',(": KN) NB. ichi_matu
wd 'gbrush'
wd 'gflood ', (": (-:KN)+Xi), ' ', (": (-:KN)+Yj), ' 255 0 0'
j =. j + 2
end.
i =. i + 1
end.
wd 'gshow;'
)
DA =: 0 1 0 1 0 1 0 1 0 1 0 1 0 1
DA =: DA, 1 0 1 0 1 0 1 0 1 0 1 0 1 0
DA =: DA, 0 1 0 1 0 1 0 1 0 1 0 1 0 1
DA =: DA, 1 0 1 2 2 2 2 2 2 2 2 0 1 0
DA =: DA, 0 1 0 2 1 0 1 0 1 0 2 1 0 1
DA =: DA, 1 0 1 2 0 1 0 1 0 1 2 0 1 0
DA =: DA, 0 1 0 2 1 0 1 0 1 0 2 1 0 1
DA =: DA, 1 0 1 2 0 1 0 1 0 1 2 0 1 0
DA =: DA, 0 1 0 2 1 0 1 0 1 0 2 1 0 1
DA =: DA, 1 0 1 2 0 1 0 1 0 1 2 0 1 0
DA =: DA, 0 1 0 2 2 2 2 2 2 2 2 1 0 1
DA =: DA, 1 0 1 0 1 0 1 0 1 0 1 0 1 0
DA =: DA, 0 1 0 1 0 1 0 1 0 1 0 1 0 1
DA =: DA, 1 0 1 0 1 0 1 0 1 0 1 0 1 0
DA =: 14 14$DA
illusion_ok_button=: 3 : 0
k =. 0
i =. 1
while. i < N do.
Xi =. i * KN
j =. 1
while. j < N do.
Yj =. j * KN
if. 0 = k{,DA
do. wd 'grgb 255 255 255'
else. wd 'grgb 0 0 0'
end.
wd 'gpen 5'
if. 2 > k{,DA do.
wd 'glines ', (": _10+Xi),' ', (": Yj), ' ', (": 10+Xi), ' ', (": Yj)
wd 'glines ', (": Xi),' ', (": _10+Yj), ' ', (": Xi), ' ', (": 10+Yj)
end.
k =. k + 1
j =. j + 1
end.
i =. i + 1
end.
wd 'gshow;'
)