Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@kohske

錯視作成に使える開発環境・言語(1)R言語

株式会社ホクソエムシリーズは昨日までで終了で、今日からは錯視と技術についてもうちょっと深くやっていきたいと思います。

今日から2、3日は、錯視の紹介はお休みして、錯視を作るのに適した開発環境・言語を紹介します。

錯視作成にプラスな点として、

  • ネイティブで描画・表示をサポートする開発環境
  • アニメーションのサポート(動画錯視の場合)
  • 色空間のサポート(RGBだけではなく、HSVも必要)
  • ベクトルデータ、ベクトル演算(錯視は繰り返しパターンが多いので、楽です)
  • 3DCGサポート
  • 簡単に使える画像・動画出力

などがあります。

R言語

R言語(あーるげんご)はオープンソース・フリーソフトウェアの錯視作成に特化したプログラミング言語及びその開発実行環境です。

というように、以下のような機能を備えています。

  • gridパッケージによる階層化されたグラフィックス生成
    • ビューポートのサポート
    • 各種ポリゴンの作成
    • ベクトルデータの描画 (これは本当に楽)
  • グラフィックス表示のネイティブサポート
  • animationパッケージによる動画作成
  • ベクトルデータ、ベクトル演算がとても簡単
  • 色空間サポート
  • rglパッケージによる3DCG
  • 作った錯視を公開するためのRPubsというサイト。
  • ダイナミックに錯視のパラメータを調整して試すためのshinyという環境。
  • Rmarkdownという錯視紹介記事作成用のパッケージ、ツール。

まさに、錯視作成のために作られた開発環境と言っても過言ではないでしょう。

なお、数年前に作ったR言語による錯視作成のデモがこちらです。

Rで錯視(第1版)

一つだけ紹介しておきましょう。

カフェウォール錯視の作成

ダウンロード.png

これはカフェウォール錯視というものです。多分エクセルでも描けます。

水平線が傾いて見えると思いますが、実際はすべて平行です。

Rでは、このパターンを

rs <- expand.grid(x = seq(0, 1, 1/10), y = seq(0, 1, 1/10))
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 <- expand.grid(x = 0:1, y = seq(0, 1, 1/20) - 1/20/2)
grid.polyline(ls$x, ls$y, id = gl(nrow(ls)/2, 2), gp = gpar(col = "grey50", lwd = 1))

と、たったこの5行で作成できるわけです。アンビリーバブル。

少し解説しておくと、

1) 0, 0.1, 0.2, ..., 1 の総当り2x(11x11)次元行列を作っています。

> rs <- expand.grid(x = seq(0, 1, 1/10), y = seq(0, 1, 1/10))
> head(rs)
    x y
1 0.0 0
2 0.1 0
3 0.2 0
4 0.3 0
5 0.4 0
6 0.5 0
> tail(rs)
      x y
116 0.5 1
117 0.6 1
118 0.7 1
119 0.8 1
120 0.9 1
121 1.0 1

2) 奇数(または偶数?)行の黒い四角を描画。中心座標がrs、幅と高さが1/10/2です。

grid.rect(rs$x, rs$y, 1/10/2, 1/10/2, gp = gpar(fill = "black", col = NA))

3) 偶数(または奇数?)行の黒い四角を↑から1/4だけずらして描画。中心座標がrsから横に1/10/4、縦に1/10/2だけずらしてるということ。

grid.rect(rs$x + 1/10/4, rs$y + 1/10/2, 1/10/2, 1/10/2, gp = gpar(fill = "black", col = NA))

4) 灰色線の座標を作成。

> ls <- expand.grid(x = 0:1, y = seq(0, 1, 1/20) - 1/20/2)
> head(ls)
  x      y
1 0 -0.025
2 1 -0.025
3 0  0.025
4 1  0.025
5 0  0.075
6 1  0.075

5) 灰色線の描画。

grid.polyline(ls$x, ls$y, id = gl(nrow(ls)/2, 2), gp = gpar(col = "grey50", lwd = 1))

錯視をプログラムで作成することのメリット

こうしてみると、錯視を作成する効率的なプログラムを作成するには、錯視の構造を理解する必要があることがわかります。ここが実は一番の狙いです。

また、パラメータを簡単に変更できることもメリットですね。例えばカフェウォールの色を変えたり、横ずれ量を変えたり。もしエクセルで作ってたら、これは無理ゲーです。

明日は

明日はProcessingについて紹介します。

Enjoy!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?