シェル ピン スキー の ギャスケット。 パスカルの三角形とシェルピンスキーギャスケット

変なフラクタル

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

はじめに 僕が今までMathematicaでプログラム書いてきて、一番多く書いてるのはフラクタル描画のコードです。 なので今週は独壇場のフラクタル週間とさせてください。 最初「コードゴルフ」と銘打とうとしていましたが、 あまり可読性を下げない程度のコードで止めておくことにしました。 (先週コードゴルフやり過ぎてちょっと限界までコードを削る精神力がなくなってます…。 ) Mathematicaは素直に書けば短くしてもあまり可読性が下がらない(と思う)ので素晴らしいです。 ちなみにTwitterに投稿できる140文字弱以下のコード(に投げられる長さ)をショートコードと呼ぶことにします。 今回のテーマ 第1回は「フラクタル図形といえば」で5本の指には入るであろう、です。 ほぼ完成形 まずはショートコードにする手前の完成コードをお見せします。 サイズを半分にする• この関数をネストさせます。 ワンライナー化 では、これをワンライナーになるようまとめて、反復関数を短縮化して、ネスト回数を6回に増やしてショートコード化しましょう。 複素数の魔法により、反復関数の適用はかなり楽になってます。 が、ベースの三角形がリスト表現されていることにより平坦化(Flatten)のレベルを気にする必要があり、 面倒くさいことになってます。 代案 三角形の代わりに点を使えば魔法の本領を発揮し、もっとすっきり書けます。

次の

フラクタル図形の世界へのいざない

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

お疲れ様です! きうちです^^ 今日は、フラクタル図形のお話をします。 あ、ソースはJavaのものを載せてありますが、 例によってC 版とVB. NET版もすぐに追加で載せようと思っています。 当時はインターネットなんてなかったので、雑誌が有益な情報源でした。 そして、そうした雑誌でときおり見かける「なんとも綺麗な図形」、それがフラクタル図形でした。 それをプログラムで描けるのだ、と知った時、 「自分もこういうのを描くプログラムを作ってみたい!」 そう思ったものです。 言うなれば、自分がパソコン&プログラム大好きになったひとつの理由ですね。 フラクタル図形とその例 フラクタル図形というのは、 「図形の部分と全体が自己相似になっている」ような図形です。 この説明だと「なんのこっちゃ」ですね。 言い換えると、「あるものの集まりが、その『あるもの』の形になっている」そんな図形です。 代表的なもので私も好きなものに「コッホ曲線」がありますね。 雪の結晶のような図形です。 描き方の考え方としては 「線の真ん中に山を作り、そうしてできたそれぞれの線の真ん中にまた山を作り…」 を繰り返す、そういうことになります。 よくよく見ると、山は正三角形になっており、その1辺と左右の辺の長さは等しいことが分かるかと思います。 今回、Javaでコッホ曲線を描くプログラムを作りました。 アプレットとして作ってあります。 興味がありましたら、打ち込んで…いや雑誌じゃないんだからコピペでいいですね。 動かしてみてください。 Eclipseで実行するときは、「Javaアプリケーション」ではなく「Javaアプレット」で実行してください。 import java. applet. Applet ; import java. awt. Color ; import java. awt. setColor Color. 三角関数は苦手な方は苦手だと思いますが、面白い、あるいは綺麗な図形を コンピュータに描かせるのに何かと使えます。 かいつまんで座標の計算方法を言うと、次のようになります。 1 起点となる座標から、目的点の座標までのベクトルの、三分の一の長さのベクトル 以下A を求める。 3 以下のように座標を計算する。 [1] 起点。 [2] 起点からベクトルAだけ移動した位置。 [3] [2]の点からベクトルBだけ移動した位置。 [4] [3]の点からベクトルCだけ移動した位置。 [5] 目標点。 ちなみに、三角関数を使わなくても座標計算をする方法はあります(タブン)。 フラクタル図形の描画処理は、メソッドが自分自身を呼び出す、いわゆる「再帰呼び出し」によって目的を達成します。 フィールドのmaxLevelの値を大きくすると再帰レベルを上げることができ、より細かい図形になります…が、あまりやりすぎると描画がつぶれて微妙なことになります(笑) ちなみにコッホというのはこの曲線を考案したスウェーデンの数学者、ヘルゲ・フォン・コッホという人です。 1870年から1924年に生きた人です。 そのころは今のようなコンピュータはまだないでしょうが、紙に書くこともできますし、概念は完成していたのでしょうね。 ついでなのでもう1つ もう1つ、私が好きなフラクタル図形である 「シェルピンスキーのギャスケット」 これについてもご紹介します。 やり方は、次のようになります。 1 三角形を描く。 2 3辺の中点を求め、それらを頂点に持つ三角形を描く。 3 そうすると周囲に3つの小さい三角形ができるので、それぞれについて 2 を実施する。 (真ん中の三角形はそのまま。 本当は塗りつぶされた三角形をくりぬいて行くというシナリオだった気がしますが、まあそこは気にせず(笑)。 これも、Javaでプログラムを書いてみました。 import java. applet. Applet ; import java. awt. Color ; import java. awt. setColor Color. drawLine x1 , y1 , x2 , y2 ; g. drawLine x2 , y2 , x3 , y3 ; g. 1882年から1969年に生きた人です。 さらに、シェルピンスキーは「シェルピンスキーのカーペット」「シェルピンスキー曲線」というのも考案しています。 まとめ 仕事でコーディングをしていると、 とかく分かりづらい・つまらないコードができあがることもしばしばですが… こういう綺麗な図形を描かせてみることで、気分転換を図るというのはいかがでしょうか。 きっと「プログラミングは本来楽しいものである」ということを思い出させてくれます^^ それから、フラクタル図形は他にもいっぱい種類があります。 それではまた! よいクリスマスを!そしてよいお年を! …っとその前に忘年会かな(笑) 追記 C 版、載せました! 2014. 21 追記 VB. NET版も載せました!.

次の

再帰プログラムでシェルピンスキーのギャスケットを描く

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

今回は、で「シェルピンスキーのギャスケット」を描くクラスを実装します。 割と有名なやつです。 と補足説明です パラメータはひとつだけで、単純なので、の補足説明でまとめます。 まずは、クラスのです。 333,0. 333,0. tran x1,y1 self. append x1 self. append y1 return self. tx,self. ty 補足説明です。 メインの処理は「draw 」です。 tran self. append x1 self. append y1 return self. tx,self. ty 座標を示す「x1、y1」を更新しながら、「n」で指定した回数繰り返します。 デフォルトでは5000回です。 x1,y1を更新する処理は「tran 」です。 333,0. 333,0. 333)ずつを加算した値と、乱数を比較して、乱数が合計値よりも小さかったら、そのインデックスを返します。 まあ・・などと偉そうにいいますが、これで図形がプロットできる理屈が完全に理解できているか?・・と聞かれると、少々厳しいです。 こうしたらいいのを経験的に知ってますということで・・すいません。 あとは、入力された「x1とy1」の変換の仕方が3パターンあるだけです。 実行してみます 上記のクラスを使って、図形を描くです。 py import matplotlib. draw plt. plot x,y,'. ' plt. title 'シェルピンスキーのガスケット' plt. show gasket. pyの名前でクラスを定義したファイルを保存した前提です。 インポートして、Gasketクラスオブジェクトを生成して、draw を呼ぶだけです。 それを、matplotlibでプロットします。 なお、タイトルは日本語にしていますけど、matplotlibはデフォルトだと日本語表示できません。 まだの場合は以下の記事を参考に、日本語化します。 さて、描かれる図形です。 おおーー。 これについては、パラメータで「n」を大きくしても、あまり変化がないので面白くありません。 だから。 おおーー。 シェルピンスキーがギャスケットが描けた! 以上! みたいな感じです。 ちょっと、つまらんですね。 ちょっとだけ小遊びです nを思い切り小さく「80」くらいにしてみます。 そして、プロットを点ではなく、直線で結ぶように変更しています。 import matplotlib. plot x,y plt. title 'シェルピンスキーのガスケット' plt. show そうすると、こんな感じになります。 ランダムなんだ・・というのが、良くわかります。 実に不思議で面白い。 そう思うわけです。 ではでは。

次の