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;'

)