
Quiero dibujar algunos arcos dentro de un círculo: van desde el ángulo (120i+30)/2^j hasta (120i+90)/2^j para todos los i,j. Los calculo con TikZ de la siguiente manera:
\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}
El resultado está bien hasta j=16, pero para el siguiente (j=32) algunos de los círculos no están colocados correctamente; y para j=64 TikZ se niega a compilar la imagen, con un error de "dimensión demasiado grande".
¿Alguien sabe cómo solucionar este problema?
¡Gracias!
Respuesta1
El dimension too large
error aparece porque necesitas utilizar un enorme \k
en tu enfoque. Estoy de acuerdo con Caverac en que no es necesario calcular las intersecciones, pero no estoy de acuerdo con el cálculo de los centros de los círculos. En su código, estos están en las intersecciones (con las que, por cierto, se podría obtener más fácilmente tangent cs:
). En principio no es necesario dibujar círculos completos, sino sólo arcos, pero debido a la forma TikZ trata ángulos que sobrepasan los 360 grados. No pude hacer que esto funcionara.ACTUALIZARMuchas gracias a Grok: cambió el orden de cómo dividir por 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}
Respuesta2
Puedes evitar dibujar los arcos, si simplemente calculas los centros de los círculos directamente y luego simplemente los recortas.
Y este es el código
\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}