feature image

2017年12月9日 | ブログ記事

フラクタルの画像を気軽に作れる"Context Free"のススメ

はじめに

これはtraP Advent Calender 2017の12/9の記事です。

こんにちは。16のShoma-Mです。
この記事ではContext Freeの紹介をしていきたいと思います。

Context Free」は再帰や確率を利用して様々な画像を作ることができます!

Context Freeを使えば、例えばこのような画像を†簡単に†生成することができます!
誰でも感覚的に遊べます。
eg_6-1

ダウンロード

まずはダウンロードしてしまいましょう。
Context Freeこのサイトに飛んで、

contextfree-----
Downloadを押して自分の機種にあった物をクリックすればできるはずです。

さっそく開きましょう。

このような画面がでると思います。
screen

左の枠がコーディングする部分で右側は出力画面です。

Hello World

とりあえず次のように書いて上の方にある「Render」ボタンを押してみましょう。

startshape primitiveShapes

shape primitiveShapes {
  CIRCLE []

  TRIANGLE [x 1.5]
 
  SQUARE [x 3]
}

次のような画像が出てきたと思います。
おめでとうございます!
primitiveShapes

基本的にはこの3つの図形、「円」「三角形」「四角形」を使っていきます。(他にも直線などもありますが割愛します。)
ちなみに先ほどのコードの意味は「primitiveShapes」から始めて、円、円から1.5右にずらして三角形、円から3右にずらして四角形というものでした。xはx座標というイメージです。

セーブ

コードのセーブは以下のようにしてできます。
save
その下の「Duplicate」を押せば複製できます。

画像の出力は「Save Image」をクリックすればできます!
export_image

基本的な操作

サイズ(s)

「s」でサイズを調整できます。

startshape primitiveShapes

shape primitiveShapes {
  CIRCLE [size 2]

  TRIANGLE [x 2 s 0.5] //s = size
 
  SQUARE [x 4 s 1 2]  //s xのsize yのsize
}

size
縦長にも横長にもできますね。
ちなみに「//」でコメントです。

回転(r)

「r」で回転(ローテート)できます。

startshape tri

shape tri {
  TRIANGLE []
  TRIANGLE [x 1.5 rotate 30]
  TRIANGLE [x 3 r 60]  // r = rotate
}

rotate
数字は角度です!

再帰

これでは面白くないので次は再帰を使いましょう!

startshape tri

shape tri {
  TRIANGLE []
  tri [x 1 s .8]
}

このように書くと次のような画像がでると思います。

recursion_1-1

なんだか無限に続いているようですね。
「Context Free」では無限に続くものでもきりのいい所で終えてくれます。

次は回転をしていきましょう!

startshape tri

shape tri {
  TRIANGLE []
  tri [x 1 r 15]
}

recursion_2

キレイな円を描けました。今回はサイズが小さくならないので、好きなタイミングで上の方にある「Stop」ボタンを押すと生成を終えてくれます。

サイズも加えていきましょう!
ちなみに「s」や「r」、「x」など書く順番は関係ないのでお好きにどうぞ。

startshape tri

shape tri {
  TRIANGLE []
  tri [x 1 s 0.9 r 15]
}

recursion_3

startshape tri

shape tri {
  TRIANGLE []
  tri [x 1 s 0.99 r 15]
}

recursion_4

サイズの値を少し変えただけで見え方が全く違いますね。
値をいじったりして楽しむこともできます。

カラー

黒色では味気ないですよね。色もいじりましょう!

startshape tri

shape tri {
  TRIANGLE [hue 0 saturation 1 brightness 1 alpha 1]
  TRIANGLE [r 20 s .8  a -.5]
  TRIANGLE [x 1.5 h 120 sat .5 b 1] 
  // h = hue, sat = saturation (s = size), b = brightness, a = alpha
}

color_0
色が付きましたね!

「hue」は色相(360度周期)
「saturation」は彩度(0-1)
「brightness」は明度(0-1)
「alpha」はアルファ値(-1で透明)
となります。

再帰で色をいじりましょう!

startshape tri

shape tri {
  TRIANGLE []
  tri [x 1 s 0.99 r 15 hue 5 sat 1 b 1]
}

color_1
キレイですね!

基本的に色の要素は再帰すると加算されていきます。
色相がずれていくのがわかると思います。

次のを見てみると加算されていくことがよりわかると思います。

startshape tri

shape tri {
  TRIANGLE []
  tri [x 1 s 0.99 r 15 hue 5 sat .01 b .1]
}

color_2

背景の色

明るいので背景を暗くしてしまいましょう。
「CF::Background = [b -1]」とすれば良いです。

CF::Background = [b -1]
//背景の色の設定
startshape tri [hue 0 sat 1 b 1]

shape tri {
  TRIANGLE []
  tri [x 1 s 0.99 r 15 hue 5 sat 1 b 1]
}

startshapeで初期値を設定することができます。

color_3

いい感じになってきましたね。

確率

確率とは言っても難しいものではないです。

以下のように「rule」とすることで「tri」の動作を分けることができます。

CF::Background = [b -1]

startshape tri [hue 0 sat 1 b 1]

shape tri 
rule {
  TRIANGLE []
  tri [x 1 s 0.99 r 15 hue 5 sat 1 b 1] //r 15
}
rule {
  TRIANGLE []
  tri [x 1 s 0.99 r -15 hue 5 sat 1 b 1] //r -15
}

rule_1
このようにすると1:1という確率でそれぞれの「rule」を勝手に選択して動作を選んでくれます。

ウニョウニョしてなんだかキモいですね。笑

「Render」をクリックするたびに様子が変わると思います。
横にある謎のアルファベットが乱数だと考えていいと思います。

「rule」の隣に数字を書くとそれだけウェイトを乗せられます!

CF::Background = [b -1]

startshape tri [hue 0 sat 1 b 1]

shape tri 
rule 10 {
  TRIANGLE []
  tri [x 1 s 0.9 r 15 hue 5 sat 1 b 1]
}
rule {
  TRIANGLE []
  tri [x 1 s 0.9 flip -15 hue 5 sat 1 b 1]
  tri [x 1 s 0.9 f -15 hue 5 sat 1 b 1] // f = flip
}

この場合は10:1となります。

rule_2

ウネウネってしてますね。

アイデアの獲得

機能は他にもありますが、これまでの基本操作で様々なことができます。

気になることがあれば公式サイトの「Documentation」に書いてあるのでぜひ参照してみてください。(自分もまだわかってないことが多いです。)

しかし、いざ自分で何かやろうとするのは難しいですよね。

そんな時には公式サイトの「Gallery」を見ましょう!

gallery

すごくこだわったものから、とても美しいものまで、とにかくすごい作品がたくさんあります。

ここで新しい発見をしたり、少し真似をして遊んでみたりするのがとても楽しいですよ!

自分で作ったもの

いくつか自分で作ったものを載せます。

値をいじったりすると新たな発見があるかもしれません。

是非遊んでみてください。

四角形

startshape sq
rule sq {
  SQUARE[s 1]
  sq[ s .8 b .1]
}

square-hnw

三角形

startshape tri

rule tri{
 TRIANGLE[]
 tri[s .85 b .1 r 6.]
}

triangle

シェルピンスキーのギャスケット

startshape sierpinski

CF::Background = [b -1]

shape sierpinski {
    TRIANGLE [b .1 hue 1 sat 1]
    TRIANGLE [b -0.9 r 0 hue 1 sat 1]	
    sierpinski [x 0 y .2985 s 0.5 b 0.6 r 0 hue 30]
    sierpinski [x -.26 y -.143 s 0.5 b 0.6 r 0 hue 10]
    sierpinski [x .26 y -.143s 0.5 b 0.6 r 0 hue -10]
}

eg_4

キズ

startshape kizu[]

shape kizu
rule 20{
   kizu [y 1 s .995 ]    
   SQUARE[]
}
rule {
  kizu [y 1 s .995 ]  
  SQUARE[]
  kizu [r 90 s .8 ]  
  SQUARE[]
}

eg_1

たくさんの目

CF::Background = [b -1]

startshape eyes

shape eyes { 
	CIRCLE [size 1 .5 b 1]
	CIRCLE [size .49 b 1 hue 13 sat 1]
	CIRCLE [size .3 b .1 sat .2]
	eyes [ z -.5 s .7 y .5 x -1 hue 10]
	eyes [ z -.5 s .7 y .5 x 1 hue 90]
}

eg_3

手招きする何か

CF::Background =  [b -1.0]

startshape cloud[r 220 y 5 b 1 hue 0]

shape cloud {
 TRIANGLE[ sat 1 y 5]
 cloud[s .79 r 0 y 5 b 1 hue 20]
 cloud[s .79 r 30 y 5 b 1 hue 1]
 cloud[s .3 r 60 y 5 b 1 hue 1]
 cloud[s .1 r 90 y 5 b 1 hue 1]
}

cloud-hzn-1

龍の翼

CF::Background = [b -1]
startshape wing [hue 300 a -.8]
shape wing {
  po [y 5 sat 1 b 1]
  po [x 8 y 5 f 90 sat 1 b 1]
}
shape po {
 po [y 5 s .78 r 10 h 10 a .01]
 po [x 1 s .78 r 30 h 10]
 SQUARE []
}

eg_6-3

カラフルな雲

CF::Background =  [b -1.0]

startshape six_cloud
 
shape six_cloud{
 cloud[r 0 y 5 b 1 hue 0]
 cloud[r 60 y 5 b 1 hue 60]
 cloud[r 120 y 5 b 1 hue 120]
 cloud[r 180 y 5 b 1 hue 180]
 cloud[r 240 y 5 b 1 hue 240]
 cloud[r 300 y 5 b 1 hue 300]
}
 
shape cloud{
 TRIANGLE[ sat 1 y 5]
 cloud[s .79 r 0 y 5 b 1 hue 20]
 cloud[s .79 r 30 y 5 b 1 hue 1]
}

eg_2-1

最後に

ここまで読んでくださりありがとうございます。

Context Freeは疲れた時によく遊んでいます。
値をいじったり、Galleryを見るだけでもとても楽しいです!

これを機に「Context Free」で遊んでいただけたらとても嬉しく思います!

明日はbudoutouさんとAhiruさんの記事です。楽しみですね!

Shoma-M icon
この記事を書いた人
Shoma-M

ドット絵、デジ絵、3DCGが好きです。

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2017年11月14日
IBIS2017参加報告
Keijan icon Keijan
2017年11月17日
そばやのワク☆ワク流体シミュレーション~MPS編~
sobaya007 icon sobaya007
2017年12月26日
RustでMCMC(Metropolis-Hasting)
David icon David
2017年12月13日
チズケ破壊論
whiteonion icon whiteonion
2017年12月1日
WaltZ
Double_oxygeN icon Double_oxygeN
2017年11月4日
文章をよしなに分散表現しよう
David icon David
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記