TikZ berechnet einige Schnittpunkte falsch, Dimension zu groß

TikZ berechnet einige Schnittpunkte falsch, Dimension zu groß

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 largeFehler 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}

Bildbeschreibung hier eingeben

Antwort2

Sie können das Zeichnen der Bögen vermeiden, indem Sie die Mittelpunkte der Kreise direkt berechnen und diese dann einfach ausschneiden

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

verwandte Informationen