10

シェルピンスキーのフラクタルを描くコードを書きました。再帰を使用するため、非常に低速です。より速くするために、再帰なしで同じコードを書く方法を知っている人はいますか?これが私のコードです:

 midpoint[p1_, p2_] := Mean[{p1, p2}]
 trianglesurface[A_, B_, C_] :=  Graphics[Polygon[{A, B, C}]]
 sierpinski[A_, B_, C_, 0] := trianglesurface[A, B, C]
 sierpinski[A_, B_, C_, n_Integer] :=
 Show[
 sierpinski[A, midpoint[A, B], midpoint[C, A], n - 1],
 sierpinski[B, midpoint[A, B], midpoint[B, C], n - 1],
 sierpinski[C, midpoint[C, A], midpoint[C, B], n - 1]
 ]

編集:

誰かが興味を持った場合に備えて、カオスゲームのアプローチで書いています。素晴らしい回答ありがとうございます!コードは次のとおりです。

 random[A_, B_, C_] := Module[{a, result},
 a = RandomInteger[2];
 Which[a == 0, result = A,
 a == 1, result = B,
 a == 2, result = C]]

 Chaos[A_List, B_List, C_List, S_List, n_Integer] :=
 Module[{list},
 list = NestList[Mean[{random[A, B, C], #}] &, 
 Mean[{random[A, B, C], S}], n];
 ListPlot[list, Axes -> False, PlotStyle -> PointSize[0.001]]]
4

5 に答える 5

7

これはScale、 とTranslateを組み合わせて使用Nest​​して、三角形のリストを作成します。

Manipulate[
  Graphics[{Nest[
    Translate[Scale[#, 1/2, {0, 0}], pts/2] &, {Polygon[pts]}, depth]}, 
   PlotRange -> {{0, 1}, {0, 1}}, PlotRangePadding -> .2],
  {{pts, {{0, 0}, {1, 0}, {1/2, 1}}}, Locator},
  {{depth, 4}, Range[7]}]

Mathematica グラフィックス

于 2012-01-30T23:05:57.577 に答える
5

あなたは試すことができます

l = {{{{0, 1}, {1, 0}, {0, 0}}, 8}};
g = {};
While [l != {},
 k = l[[1, 1]];
 n = l[[1, 2]];
 l = Rest[l];
 If[n != 0,
  AppendTo[g, k];
  (AppendTo[l, {{#1, Mean[{#1, #2}], Mean[{#1, #3}]}, n - 1}] & @@ #) & /@
                                                 NestList[RotateLeft, k, 2]
  ]]
Show@Graphics[{EdgeForm[Thin], Pink,Polygon@g}]

そして、AppendToをより効率的なものに置き換えます。たとえば、https://mathematica.stackexchange.com/questions/845/internalbag-inside-compileを参照してください

ここに画像の説明を入力

編集

もっと早く:

f[1] = {{{0, 1}, {1, 0}, {0, 0}}, 8};
i = 1;
g = {};
While[i != 0,
 k = f[i][[1]];
 n = f[i][[2]];
 i--;
 If[n != 0,
  g = Join[g, k];
  {f[i + 1], f[i + 2], f[i + 3]} =
    ({{#1, Mean[{#1, #2}], Mean[{#1, #3}]}, n - 1} & @@ #) & /@ 
                                                 NestList[RotateLeft, k, 2];
  i = i + 3
  ]]
Show@Graphics[{EdgeForm[Thin], Pink, Polygon@g}]
于 2012-01-30T22:15:09.110 に答える
5

シェルピンスキー三角形の高品質な近似が必要な場合は、カオス ゲームと呼ばれるアプローチを使用できます。アイデアは次のとおりです - シェルピンスキー三角形の頂点として定義したい 3 つのポイントを選び、それらのポイントの 1 つをランダムに選択します。次に、必要なだけ次の手順を繰り返します。

  1. トラングルの頂点をランダムに選択します。
  2. 現在の点から、現在の位置と三角形の頂点の間の中間点に移動します。
  3. その時点でピクセルをプロットします。

このアニメーションでわかるように、この手順は最終的に三角形の高解像度バージョンをトレースします。必要に応じて、複数のプロセスで一度にピクセルをプロットするようにマルチスレッド化できます。これにより、三角形をより迅速に描画できます。

あるいは、再帰コードを反復コードに変換したいだけの場合、1 つのオプションはワークリスト アプローチを使用することです。三角形の頂点と数 n を保持するレコードのコレクションを含むスタック (またはキュー) を維持します。最初に、主三角形の頂点とフラクタル深度をこのワークリストに入れます。それで:

  • ワークリストが空でない場合:
    • ワークリストから最初の要素を削除します。
    • n 値がゼロでない場合:
      • 三角形の中点を結ぶ三角形を描きます。
      • 部分三角形ごとに、n 値 n - 1 の三角形をワークリストに追加します。

これは本質的に再帰を繰り返しシミュレートします。

お役に立てれば!

于 2012-01-30T20:01:44.083 に答える
3

三角形ベースの関数は既に十分にカバーされているため、ここではラスター ベースのアプローチを示します。
これはパスカルの三角形を繰り返し構築し、モジュロ 2 を取り、結果をプロットします。

NestList[{0, ##} + {##, 0} & @@ # &, {1}, 511] ~Mod~ 2 // ArrayPlot

Mathematica グラフィックス

于 2012-02-01T03:10:33.273 に答える
1
Clear["`*"];
sierpinski[{a_, b_, c_}] := 
  With[{ab = (a + b)/2, bc = (b + c)/2,  ca = (a + c)/2}, 
   {{a, ab, ca}, {ab, b, bc}, {ca, bc, c}}];

pts = {{0, 0}, {1, 0}, {1/2, Sqrt[3]/2}} // N;
n = 5;
d = Nest[Join @@ sierpinski /@ # &, {pts}, n]; // AbsoluteTiming
Graphics[{EdgeForm@Black, Polygon@d}]

(*sierpinski=Map[Mean, Tuples[#,2]~Partition~3 ,{2}]&;*)

これが3Dバージョンですhttps://mathematica.stackexchange.com/questions/22256/how-can-i-compile-this-function

ここに画像の説明を入力

ListPlot@NestList[(# + RandomChoice[{{0, 0}, {2, 0}, {1, 2}}])/2 &,
 N@{0, 0}, 10^4]

With[{data = 
   NestList[(# + RandomChoice@{{0, 0}, {1, 0}, {.5, .8}})/2 &, 
    N@{0, 0}, 10^4]}, 
 Graphics[Point[data, 
   VertexColors -> ({1, #[[1]], #[[2]]} & /@ Rescale@data)]]
 ]

With[{v = {{0, 0, 0.6}, {-0.3, -0.5, -0.2}, {-0.3, 0.5, -0.2}, {0.6, 
     0, -0.2}}}, 
 ListPointPlot3D[
  NestList[(# + RandomChoice[v])/2 &, N@{0, 0, 0}, 10^4], 
  BoxRatios -> 1, ColorFunction -> "Pastel"]
 ]

ここに画像の説明を入力 ここに画像の説明を入力

于 2013-09-15T16:42:36.220 に答える