
Ich möchte einige Bögen innerhalb eines Kreises zeichnen: Sie gehen vom Winkel (120i+30)/2^j bis (120i+90)/2^j für alle i,j. Ich berechne sie mit TikZ wie folgt:
\documentclass{minimal}
\usepackage{tikz}
%\usepackage{fp}\usetikzlibrary{fixedpointarithmetic}
\usetikzlibrary{calc,intersections}
\begin{document}
\def\myarc#1#2{\path[name path=a] ({#1}:1) -- ($({#1}:1)!10cm!270:(0,0)$);
\path[name path=b] ({#2}:1) -- ($({#2}:1)!10cm!90:(0,0)$);
\draw[name intersections={of=a and b,by=t}] (t) let \p1 = ($(t)-({#1}:1)$) in
circle ({veclen(\x1,\y1)});
}
\begin{center}
\begin{tikzpicture}[scale=3]
\draw (0,0) circle (1cm);
\clip (0,0) circle (1cm);
\begin{scope}[very thick]\myarc{120}{240}\end{scope}
\myarc{300}{60}
\foreach\j/\k in {1/360,2/720,4/1440,8/2880,16/5760,32/11520} { %,64/23040} {
\foreach\i in {150,330,...,\k} {\myarc{\i/\j}{(\i+60)/\j}};
}
\end{tikzpicture}
\end{center}
\end{document}
Bis j=16 ist das Ergebnis in Ordnung, beim nächsten Wert (j=32) sind jedoch einige Kreise nicht richtig platziert, und bei j=64 weigert sich TikZ, das Bild zu kompilieren, und meldet die Fehlermeldung „Dimension zu groß“.
Weiß jemand, wie man das behebt?
Danke!
Antwort1
Der dimension too large
Fehler tritt auf, weil Sie in Ihrem Ansatz ein riesiges verwenden müssen \k
. Ich stimme Caverac zu, dass Sie die Schnittpunkte nicht berechnen müssen, aber ich bin nicht einverstanden mit der Berechnung der Mittelpunkte der Kreise. In Ihrem Code befinden sich diese an den Schnittpunkten (die übrigens leichter mit zu erhalten wären tangent cs:
). Im Prinzip müssen Sie keine vollständigen Kreise zeichnen, sondern nur Bögen, aber aufgrund der Art und Weise, wie TikZ behandelt Winkel, die über 360 Grad hinausgehen. Ich konnte dies nicht zum Laufen bringen.AKTUALISIERENmit großem Dank an grok: die Reihenfolge der Division durch wurde geändert 2^\k
.
\documentclass[border=3pt]{standalone}
\usepackage{tikz}
\newcommand{\DrawArc}[3][]{ % from angle #2-#3 to #2+#3
\draw[#1] ({#2}:{sec(#3)}) circle ({tan(#3)});
}
\begin{tikzpicture}[scale=3]
\draw[very thin] (0,0) circle (1cm);
\clip (0,0) circle (1cm);
\DrawArc[thick]{180}{60}
\foreach\k in {0,...,7} {
\pgfmathsetmacro{\j}{2*2^\k}
\foreach\i in {1,...,\j} {\DrawArc{180/2^\k*\i}{30/2^\k}};
}
\end{tikzpicture}
\end{document}
Antwort2
Sie können das Zeichnen der Bögen vermeiden, indem Sie die Mittelpunkte der Kreise direkt berechnen und diese dann einfach ausschneiden
Und das ist der Code
\documentclass{article}
\usepackage{tikz}
\usepackage{expl3}
\ExplSyntaxOn
\cs_set_eq:NN \fpeval \fp_eval:n
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}[scale = 3]
\draw (0,0) circle (1cm);
\clip (0,0) circle (1cm);
\foreach \i in {1,...,128} {
\foreach \j in {1,...,32} {
\pgfmathsetmacro{\theta}{\fpeval{(120 * \i + 60) / 2^\j}}
\pgfmathsetmacro{\dtheta}{\fpeval{60 / 2^\j}}
\pgfmathsetmacro{\r}{0.5 * sqrt(2 - 2 * cos(\dtheta))}
\pgfmathsetmacro{\x}{cos(\theta)}
\pgfmathsetmacro{\y}{sin(\theta)}
\draw[] (\x, \y) circle (\r);
}
}
\end{tikzpicture}
\end{document}