
Ich versuche, dieses spezielle fraktale Bild einer Blume zu erzeugen, weiß aber nicht einmal, wo oder wie ich anfangen soll. Kann TikZ verwendet werden, um ein „Phylotaktische Spirale"?
Ich habe es hier gesehen:https://www.reddit.com/r/FractalPorn/comments/xr17t1/fractal_rose/
und das Bild sieht wie unten dargestellt aus:
Es sieht nach einer Menge Punkte aus, also habe ich es mit einem Streudiagramm versucht pgfplots
, aber es ist völlig fehlgeschlagen. Kein Code, der es wert wäre, hier angezeigt zu werden.
BEARBEITEN: Wie kann ich mehr als einer Antwort ein grünes Häkchen setzen? Die Ergebnisse, die Sie geliefert haben, sind erstaunlich!
Antwort1
Ich benutzeSandy Gs Formelhier im Grunde das .707^<level>
Teil.
Zwei Ansätze:
- PGF und LuaLaTeX, das verwendetJLDiaz‘ großartiges Poisson-Lua-Skript.
- TikZ und PGFmath, die nur die
rnd
Funktion verwenden.
Das Makro \pgfpointspiralifdefined
stellt sicher, dass bereits berechnete Koordinaten nicht erneut berechnet werden müssen.
Anstelle der Koordinaten a
, b
, c
und d
können Sie auch die vertex
Anker derDrachenformdie in der Antwort von Sandy G verwendet wird (Sie müssen die Knoten natürlich benennen, z. B. spiral-\l-\n
).
In beiden Lösungen verdreifache ich einen der Zufallswerte, sodass die Punkte auf einer Seite des Drachens konzentriert werden.
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
Dies \pgfpointspiralifdefined
hätte auch durch ein benutzerdefiniertes TikZ-Koordinatensystem implementiert werden können, aber wozu die Mühe …
\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}
Ausgabe
Antwort2
Hier ist die Rose, die die kite
Knotenform aus der Tikz-Bibliothek verwendet shapes.geometric
. Ich überlasse es anderen, die Knoten mit Punkten zu füllen.
\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}
Um eine Rose mit 8 Scheitelpunkten zu erhalten, müssen die Winkel der Drachenscheitelpunkte um 45 abweichen (120 und 75 im obigen Code). Sie können .703
in ändern (sin((\aaa-45)/2)/sin(\aaa/2))
, wobei \aaa
der größere Winkel ist, um Variationen in der Form zu erhalten. Der 1.38
Faktor muss ebenfalls angepasst werden.
Antwort3
Ich habe versucht, die Konstruktion mithilfe einer pic
und einer helixartigen Kurve zu erstellen. Alle Berechnungen sind in der Definition des petalPiece
( pic
Elements) verborgen, das ein Viereck erstellt; jedes Blütenblatt besteht aus \nbQuad
Stücken.
Es gibt zwei globale Variablen: die Anzahl der Blütenblätter und die Anzahl der Teile für jedes Blütenblatt. Mit 9 Blütenblättern erhalten wir beispielsweise die folgende Zeichnung.
Der Code
\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}