Home » ブログ » written by 鈴木 孝一 » [Webときどきサイエンス] Rで錯視絵を描く

[Webときどきサイエンス] Rで錯視絵を描く

2012.9.21 category : ブログ written by 鈴木 孝一

こんにちは。鈴木です。
今日も、サイエンスに関するWeb上のサービスやデータベースを紹介していきます。

今回のソフト/サービス

今回ご紹介するのは、
R言語(通称:アール)  です。

統計解析のフリーソフトで、統計解析機能はもちろん、パワフルな描画機能も備えています。
色んなことに使えるソフトなのですが、今回は
錯覚、錯視
の絵を自分で書いてみる、ということに使いたいと思います。

↓こういうのです。

なるべく、簡単に説明します。難しいことを考えなくても、
書いてある通りにすれば自分で錯視の絵が描ける、というのを目標にしますので、
是非一度試してみてください。

使い方

さて使い方ですが、まずソフトをダウンロードしましょう。
下記のリンクをクリックして、それぞれダウンロードしたら、exeを実行します(ダブルクリックします)。

Rのダウンロード

WindowsのVista以前のものや、Mac、Linuxをお使いの方は下記を参考に適宜インストールしてください。

Rのインストール – RjpWiki

下記のようなものが出てきますが、気にせず、実行、OK、次へ、次へ・・・と押していけば、
インストールが完了します。

Rインストール操作1

Rインストール操作2

Rインストール操作3

インストールできたら、ソフトを立ち上げます。
デスクトップにアイコンがあるのでダブルクリックしましょう。あるいはスタートメニューから起動しても構いません。

操作方法

Rを立ち上げると下記のような画面になっているはずです。

R立ち上げ画面

これから、パッケージというものをインストールします。
錯視の絵を書くのに必要なものを入れていきます。

上のメニューの「パッケージ」をクリックし、「パッケージのインストール」を選択します。

Rパッケージインストール1

どこのサイトからダウンロードするか聞かれますので、
ご自分の場所から近い場所を選んでください。
日本だと、兵庫、筑波、東京があります。

Rパッケージインストール2

次に、インストールするパッケージを選びます。
plyr
というのを選んでOKをクリックしてください。

Rパッケージインストール3

これで準備完了です。
後もう少しなので、頑張ってついてきて下さい!

次の2行をコピーして、R Consoleのところにペースト(貼り付け)してください。

library(grid)
library(plyr)

Rライブラリ読み込み

次に、この5行をコピーペーストしてください。その後、一度改行します(エンターキーを押します)。

rs grid.rect(rs$x, rs$y, 1/10/2, 1/10/2, gp = gpar(fill = “black”, col = NA))
grid.rect(rs$x + 1/10/4, rs$y + 1/10/2, 1/10/2, 1/10/2, gp = gpar(fill = “black”, col = NA))
ls grid.polyline(ls$x, ls$y, id = gl(nrow(ls)/2, 2), gp = gpar(col = “grey50”, lwd = 1))

すると、「カフェウォール錯視」の絵が描画されます!

Rでカフェウォール錯視描画

どうみても横の線が曲がっているように見えますよね。
実際には全て直線です。。。

カフェウォール錯視

他にも、
きらめき格子錯視

nx grid.newpage()
grid.rect(0.5, 0.5, 1, 1, gp = gpar(fill = “black”))
ls grid.polyline(ls$x, ls$y, id = gl(nrow(ls)/2, 2), gp = gpar(col = “grey”, lwd = lwd))
ls grid.polyline(ls$x, ls$y, id = gl(nrow(ls)/2, 2), gp = gpar(col = “grey”, lwd = lwd))
ls grid.circle(ls$x, ls$y, r= cr, gp = gpar(col = NA, fill = “white”))

オオウチ錯視

grid.newpage()
nx rs grid.rect(rs$x, rs$y, 1/nx/2, 1/ny/2, gp = gpar(col = NA, fill = c(“black”, “white”)))
rs grid.rect(rs$y, rs$x, 1/ny/2, 1/nx/2, gp = gpar(col = NA, fill = c(“black”, “white”)))

明るさの対比

grid.newpage()
grid.rect(c(1,3,1,3)/4, c(3,3,1,1)/4, 1/2, 1/2, gp = gpar(col = NA, fill = gray(1:4/5)))
grid.rect(c(1,3,1,3)/4, c(3,3,1,1)/4, 1/6, 1/6, gp = gpar(col = NA, fill = gray(0.5)))

エッジの錯視

grid.newpage()
nx an rs grid.rect(rs$x, rs$y, 1/nx/2, 1/ny/2, gp = gpar(col = NA, fill = c(“black”, “white”)))
rs rs$an l_ply(1:nrow(rs), function(i) {
pushViewport(viewport(rs$x[i], rs$y[i], 1/30, 1/30, angle = rs$an[i]*45))
grid.rect(c(1,3,1,3)/4, c(3,3,1,1)/4, 1/2, 1/2, gp = gpar(col = NA, fill = gray(c(0,1,1,0))))
popViewport()
})

蛇の回転錯視」←オススメ!

nt <- 41; nr <- 15; br <- 0.8 col1 <- c("black", "white") col2 <- c("aquamarine4", "gold2") f <- function(x0, y0) { r <- embed(br^(0:nr), 2) t <- embed(seq(0, 2*pi, length=nt), 2) i <- as.matrix(expand.grid(1:nrow(r), 1:nrow(t))) ci <- 1 + (i[,2]%%2 + i[,1]%%2) %% 2 p <- t(apply(i, 1, function(x) c(r[x[1], ], t[x[2], ]))) x <- c(p[,1]*cos(p[,3]), p[,1]*cos(p[,4]), p[,2]*cos(p[,4]), p[,2]*cos(p[,3])) y <- c(p[,1]*sin(p[,3]), p[,1]*sin(p[,4]), p[,2]*sin(p[,4]), p[,2]*sin(p[,3])) grid.polygon(x0+x/2, y0+y/2, id = rep.int(1:nrow(p), 4), gp = gpar(fill = col1[ci], col=NA), default.units="native") p <- expand.grid(1:nrow(r), sign((abs(x0-y0)==1)-0.5)*seq(0, 2*pi, length=41)[-1]) p <- cbind(p[,2], rowMeans(r)[p[,1]], (r[,2]-r[,1])[p[,1]]/2) t <- seq(0, 2*pi, length=20)[-1] x <- c(apply(p, 1, function(a) a[2]*cos(a[1])+a[3]*(cos(a[1])*cos(t)-0.5*sin(a[1])*sin(t)))) y <- c(apply(p, 1, function(a) a[2]*sin(a[1])+a[3]*(sin(a[1])*cos(t)+0.5*cos(a[1])*sin(t)))) col <- if(abs(x0-y0)==1) {col2} else {rev(col2)} grid.polygon(x0+x/2, y0+y/2, id = rep(1:nrow(p), each=length(t)), gp = gpar(fill = col[ci], col=NA), default.units="native") } grid.newpage() pushViewport(viewport(xscale = c(0, 3), yscale = c(0, 3))) for (x0 in 0.5+0:2) for (y0 in 0.5+0:2) f(x0, y0) for (x0 in 1:2) for (y0 in 1:2) f(x0, y0)

などを作ることができます。
続けて描画するときは、描画されたウィンドウを閉じてから、次をコピペしてください。

なお上記のプログラムは全て、
Rで錯視(第1版)
から引用させていただいております。

発展的な使い方

Rが使える方は、パラメータをいじれば絵をカスタマイズすることも可能です。
例えば、「black」と書いてある部分を「red」にすると、黒色だった箇所が赤色になったりします。

より錯視がキツクなる絵を探すのも楽しそうですね。

今回ご紹介した錯視プログラミングは、
先日たまたま明治大学を通りかかったときに、第5回錯覚ワークショップが開催されていて、楽しそうなので飛び入りで参加した際に知りました。
東京大学先端科学技術研究センターの高橋康介さん、楽しいお話をありがとうございました。

written by 鈴木孝一

鈴木 孝一

オキドキサイエンス代表。以前はデータマイニング会社に勤務してました。前職でのスキルを活かし、「Webときどきサイエンス」と題して、サイエンスに関するWeb上のサービスやデータベースを紹介しています。 最近の趣味は、実験キット開発と器械体操・アクロバットです。

Copyright(c) 2012 オキドキサイエンス | 科学教材 実験キット販売 All Rights Reserved.