Asymptoteで錯視

英語ではOptical illusion。何故そう見えるか、というのは分かっていないものも幾つかある様で、専門に研究している人は毎日目が痛いんじゃないだろうか。万年慢性眼精疲労である僕には出来ないな。

総じて言えば、背景や周辺の状況から脳が読み取って解析過程で生じる、先入観とか負荷による計算間違いの誤解、という解釈でよろしいかしら。

錯視 - WikipediaOptical illusion - Wikipediaから適当に取ってきて、簡単そうなやつを作図。

ミュンスターバーグ錯視

平行な直線が歪んで見える。直線を灰色にするとカフェウォール錯視になる。


for(int k : sequence(8)) {
    for(int l : sequence(8)) {
        fill(shift(80k+6(l%2), 50l)*scale(50)*unitsquare);
    }
    draw((0,50k)--(600, 50k));
}

デルブーフ錯視

黒円の大きさが異なって見える。


fill(scale(50)*unitcircle);
draw(scale(100)*unitcircle);
fill(shift(200)*scale(50)*unitcircle);
draw(shift(200)*scale(60)*unitcircle);

エビングハウス錯視

オレンジ円の大きさが異なって見える。


fill(scale(15)*unitcircle, orange);
for(int s : sequence(6)) { fill(rotate(60s)*shift(60)*scale(28)*unitcircle, gray); }
fill(shift(200)*scale(15)*unitcircle, orange);
for(int s : sequence(8)) { fill(rotate(s*360/8, (200,0))*shift(225)*scale(7)*unitcircle, gray); }

エーレンシュタイン錯視

円の中の正方形が歪んで見える。


for(int s : sequence(20)) { draw(scale(5s+10)*unitcircle); }
draw(rotate(45)*shift((-70,-70))*scale(140)*unitsquare);

カニッツァの三角形

真ん中に三角形があるように見える。


pair a = (80, 0);
for(int r : sequence(3)) {
    fill(rotate(30+120r)*shift(a)*scale(25)*unitcircle);
}
path tri = rotate(30)*(a)--rotate(150)*(a)--rotate(270)*(a)--cycle;
draw(reflect((1,0),(-1,0))*tri);
fill(tri, white);

プログラム上では白い三角形を描いているので、なんかズルした気分。

White's illusion

左側の灰色と右側の灰色は同じ色なのだが、異なる色(明るさ)に見える。


fill(box((250, 0), (350,80)), gray);
for(int s : sequence(5)) {draw(shift((0, 20s))*((0,0)--(400,0)), linewidth(10));}
fill(box((100, -4), (200,85)), gray);
for(int s : sequence(5)) {draw(shift((0, 20s+10))*((0,0)--(200,0)), white+linewidth(10));}

終わりに

こうやって錯視を幾つも見ていると、日頃頼りまくっている目、そしてそれを統括する脳なんて、ちっとも信用出来ないと感じられる。他人が見ているものの解釈と自分のそれが同一であるとは勿論言えないわけだが、自分1人だって、正しいものを解釈出来ていない。

まあ、これを活用して、自分だけ正しいこと(ここで挙げた例だとコード)を知っていて、他人にはあたかも正しいかの様にちょっとした誤解(ここで挙げた錯視の図)を伝える、という方法は大いに使い道がありそうだ。