フラクタルフラワーにLaTeX/TikZを使用する

フラクタルフラワーにLaTeX/TikZを使用する

私は花のこの特定のフラクタル画像を生成しようとしていますが、どこからどのように始めればよいのかさえわかりません。TikZを使用して「系統的螺旋「?」

ここで見ました:https://www.reddit.com/r/FractalPorn/comments/xr17t1/fractal_rose/

画像は以下のようになります。 フラクタル画像

点がたくさんあるように見えるので、 の散布図を試してみましたpgfplotsが、完全に失敗しました。ここで示す価値のあるコードはありません。

編集: 複数の回答に緑色のチェックマークを付けるにはどうしたらいいですか? 皆さんが出した結果は驚くべきものです!

答え1

私は使用していますサンディGの公式ここでは、基本的にその.707^<level>部分です。

2つのアプローチ:

  1. PGFとLuaLaTeXを使用するJLDiaz の素晴らしいポアソン Lua スクリプト
  2. 関数を使用するだけの TikZ と PGFmath rnd

マクロは\pgfpointspiralifdefined、すでに計算された座標を再計算する必要がないことを確認します。

座標a、、bの代わりに、のアンカーを使用することもできますcdvertex凧の形Sandy G の回答で使用されているもの (もちろんノードに名前を付ける必要があります、例: spiral-\l-\n)。

どちらのソリューションでも、ランダム値の 1 つを 3 乗して、ポイントが凧の片側に集まるようにしています。

PGF + LuaLaTeX

\documentclass{standalone}
\usepackage{pgf,pgffor}
\usepackage{jldiaz-poisson}% https://tex.stackexchange.com/a/185423/16595
\usepackage{xcolor} % colorwheel
\definecolor{cw0}{HTML}{9AFF00}\definecolor{cw1}{HTML}{FFA500}
\definecolor{cw2}{HTML}{FF001A}\definecolor{cw3}{HTML}{FF00D9}
\definecolor{cw4}{HTML}{6500FF}\definecolor{cw5}{HTML}{005AFF}
\definecolor{cw6}{HTML}{00FFE5}\definecolor{cw7}{HTML}{00FF25}
\pgfset{
  declare function={
    spiralAngle(\level,\spiral) = \directlua{tex.print(
      180/(\pgfkeysvalueof{/pgf/spiral\space N})*\level
     +360/(\pgfkeysvalueof{/pgf/spiral\space N})*\spiral)};
    spiralRadius(\level)        = \directlua{tex.print(
      .707^\level*(\pgfkeysvalueof{/pgf/spiral\space radius}))};
    xSpread(\n)=\n^3*.8+.1; ySpread(\n)=\n*.8+.1;},
  spiral radius/.initial=5, spiral N/.initial=8}
\newcommand*\pgfpointspiral[2]{% #1 = level, #2 = spiral
  \pgfpointpolarxy{spiralAngle(#1,#2)}{spiralRadius(#1)}}
\makeatletter
\newcommand*\pgfpointspiralifdefined[3]{%
  % if spiral-#2-#3 doesn't exist, define it
  % if it does do nothing
  \pgfutil@ifundefined{pgf@sh@ns@spiral-#2-#3}{%
    \pgfcoordinate{spiral-#2-#3}{\pgfpointspiral{#2}{#3}}%
  }{}% and make it an alias for #1
  \pgfnodealias{#1}{spiral-#2-#3}}
\makeatother
\begin{document}
\begin{pgfpicture}
\pgfsetxvec{\pgfqpoint{5mm}{0mm}}
\pgfsetyvec{\pgfqpoint{0mm}{5mm}}
\foreach \l in {0,...,6}{
  \foreach \n in {0,...,7}{
    \pgfpointspiralifdefined{a}{\l}            {\n}
    \pgfpointspiralifdefined{b}{\inteval{\l+1}}{\n}
    \pgfpointspiralifdefined{c}{\l}            {\inteval{\n+1}}
    \pgfpointspiralifdefined{d}{\inteval{\l-1}}{\inteval{\n+1}}
    \pgfsetfillcolor{cw\n}
    \foreach[expand list, evaluate={\xSpread=xSpread(\x);}]
      \x/\y in {\poissonpointslist{1}{1}{.02+.0\l}{10}} {
      \pgfpathcircle{
        \pgfpointlineattime{ySpread(\y)}
          {\pgfpointlineattime{\xSpread}
            {\pgfpointanchor{a}{center}}{\pgfpointanchor{b}{center}}}
          {\pgfpointlineattime{\xSpread}
            {\pgfpointanchor{d}{center}}{\pgfpointanchor{c}{center}}}
      }{+.25pt}
      \pgfusepath{fill}
    }
  }
}
\end{pgfpicture}
\end{document}

TikZ + PGFmath

これは\pgfpointspiralifdefinedカスタム TikZ 座標系で実装することもできますが、なぜわざわざそうするのでしょうか...

\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\pgfset{
  declare function={
    xSpread(\n)=\n^3*.8+.1; ySpread(\n)=\n*.8+.1;},
  spiral radius/.initial=5,
  spiral N/.initial=8}
\newcommand*\pgfpointspiral[2]{% #1 = level, #2 = spiral
  \pgfpointpolarxy{180/(\pgfkeysvalueof{/pgf/spiral N})*(#1)
                  +360/(\pgfkeysvalueof{/pgf/spiral N})*(#2)}
                  {.707^(#1)*(\pgfkeysvalueof{/pgf/spiral radius})}}
\makeatletter
\newcommand*\pgfpointspiralifdefined[3]{%
  \pgfutil@ifundefined{pgf@sh@ns@spiral-#2-#3}{%
    \pgfcoordinate{spiral-#2-#3}{\pgfpointspiral{#2}{#3}}%
  }{}%
  \pgfnodealias{#1}{spiral-#2-#3}}
\makeatother
\begin{document}
\begin{tikzpicture}[x=+5mm, y=+5mm]
\foreach \l[evaluate={\Dots=250*.7^\l}] in {0,...,6} {
  \foreach \n in {0,...,7} {
    \pgfpointspiralifdefined{a}{\l}            {\n}
    \pgfpointspiralifdefined{b}{\inteval{\l+1}}{\n}
    \pgfpointspiralifdefined{c}{\l}            {\inteval{\n+1}}
    \pgfpointspiralifdefined{d}{\inteval{\l-1}}{\inteval{\n+1}}
    \fill[radius=+.4pt] foreach[
      evaluate={\xSpread=xSpread rnd; \ySpread=ySpread rnd;}]
      \dot in {0,...,\Dots} {
        ($($(a)!\ySpread!(d)$)!\xSpread!($(b)!\ySpread!(c)$)$)
        circle[radius=+.4pt]};
  }
}
\end{tikzpicture}
\end{document}

出力

ここに画像の説明を入力してください ここに画像の説明を入力してください

答え2

kiteこれはtikz ライブラリのノード形状を使用したバラですshapes.geometric。ノードをドットで埋めるのは他の人に任せます。

ここに画像の説明を入力してください

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes.geometric}

\tikzset{mykite/.style={inner sep=.1pt, kite, fill=red!30, kite vertex angles=120 and 75}}

\begin{document}

\begin{tikzpicture}
\foreach \l in {1,...,12}{
\foreach \n[evaluate=\n as \t using \l*22.5+\n*45, % \t is the angle for node placement
    evaluate=\n as \s using .703^(\l-1), % \s is the scaling factor for the distance from 0 for each level
    evaluate=\n as \c using \s-.01] in {1,...,8} % \c is used to shrink each node just a bit.
    {\node[mykite, rotate=\t, minimum size=\c cm] at (\t-90:{\s*1.38}){};}
}
\end{tikzpicture}

\end{document}

8 頂点のバラを作成するには、凧の頂点角度が 45 度異なる必要があります (上記のコードでは 120 度と 75 度)。.703を に変更することができます。(sin((\aaa-45)/2)/sin(\aaa/2))ここで は\aaa大きい方の角度であり、形状にバリエーションを持たせることができます。1.38係数も調整する必要があります。

ここに画像の説明を入力してください

答え3

ここに画像の説明を入力してくださいテスト

私は とらせん状の曲線を使用して構築を試みました。すべての計算は、四角形を作成する(要素)picの定義に隠されています。各花びらはピースで構成されます。petalPiecepic\nbQuad

グローバル変数は 2 つあります。花びらの数と、各花びらのピースの数です。たとえば、花びらが 9 枚の場合、以下の図のようになります。 ここに画像の説明を入力してください

コード

\documentclass[11pt, margin=1cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math, calc}
\begin{document}

\tikzmath{
  integer \nbPetals, \nbQuad;
  \nbPetals = 8;
  \nbQuad = 7;
  real \a, \base, \r;
  \a = 360/\nbPetals;  % petal's angle
  \base = 2;  % base of the exponential definig the helix
  \r = .35;  % scaling constant
  function tmpR(\i) {% integer giving a point along the helix
    return {\r*pow(\base, 3.145*\i/\nbQuad)};
  };
}
\tikzset{%
  pics/petalPiece/.style 2 args={% branch number, base point number
    code={%
      \tikzmath{integer \b, \p; \b = #1; \p = #2;}
      \path
      (\p/\nbQuad*180 +\b*\a: {tmpR(\p)}) coordinate (NW)
      ({(\p +1)/\nbQuad*180 +\b*\a}: {tmpR(\p +1)}) coordinate (NE)
      ({(\p +2)/\nbQuad*180 +(\b -1)*\a}: {tmpR(\p +2)}) coordinate (SE)
      ({(\p +1)/\nbQuad*180 +(\b -1)*\a}: {tmpR(\p +1)}) coordinate (SW);
      \foreach \i in {0, .05, ..., .9}{%
        \draw[white, thick, fill=magenta!90, opacity=.05]
        ($(NW)!\i!(SW)$) -- ($(NE)!\i/2!(SE)$) -- (SE) -- (SW) -- cycle;
      }
    }
  }
}
\begin{tikzpicture}
  \foreach \l in {1, 2, ..., \nbPetals}{
    \foreach \i in {-1, 0, 1, 2, ..., \nbQuad}{%
      \path (0, 0) pic {petalPiece={\l}{\i}};
    }
  }
\end{tikzpicture}

関連情報