2017年10月28日土曜日

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


pbmファイルでシェルピンスキーのギャスケットを描きます。
まずパスカルの三角形をつくります。



$ runghc -XParallelListComp pascal.hs 3
[1]
[1,1]
[1,2,1]
[1,3,3,1]
[1,4,6,4,1]
[1,5,10,10,5,1]
[1,6,15,20,15,6,1]
[1,7,21,35,35,21,7,1]


奇数部を1、偶数部を0に置き換えます。

$ runghc -XParallelListComp sierpinski.hs 10 | display

描画には10数秒かかります。

コンパイルすればほぼ一瞬で描画するようになります。



http://senjounosantafe.blogspot.com/2019/02/blog-post.html

上記のページに

Python のコードを出力し
Turtle グラフィックスで
シェルピンスキーのギャスケットを再帰的に描画するHaskellのコードを置いています。


また1次元のセル・オートマトンにルール90を適用することでもシェルピンスキーのギャスケットを描画できるそうです。




実行例
$ runghc ca.hs




main を

main =  loop0 fs 31 $ reverse "11100001"

と書き換えるとルール225を描画します。



Intから2進数の文字列に変換するには
「2進、8進、10進、16進の各表現を相互に変換する」のページ

https://github.com/haskell-jp/recipe-collection/blob/master/%E6%95%B0%E5%80%A4/2%E9%80%B2%E3%80%818%E9%80%B2%E3%80%8110%E9%80%B2%E3%80%8116%E9%80%B2%E3%81%AE%E5%90%84%E8%A1%A8%E7%8F%BE%E3%82%92%E7%9B%B8%E4%BA%92%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B.md


を参考に。

具体的には

ghci> import Numeric
ghci> import Data.Char
ghci> showIntAtBase 2 intToDigit 123 "" -- 123を2進数表記
"1111011"

ただし8桁になるように先頭にゼロを埋めること。

"1111011" -> "01111011"



参考ページ
Elementary Cellular Automata

http://atlas.wolfram.com/01/01/



その他のルールも適用可能にし精細な画像を描くにはこちら。

http://hhg2the-haskell.blogspot.com/2019/02/blog-post.html

0 件のコメント:

コメントを投稿

Haskell Process

Haskellの System.Processは便利ですが、問題もあります。 単一スレッドでの逐次処理を保証していない。(想像です。) 次のようなスクリプトを書いてみた。 --a.hs main = print [1..10] --t.hs import Sy...