
円の中にいくつかの円弧を描きたいのですが、すべての i,j について、角度 (120i+30)/2^j から (120i+90)/2^j までです。TikZ で次のように計算します。
\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}
j=16 までは結果は良好ですが、次の j (j=32) では一部の円が正しく配置されません。また、j=64 では TikZ が「次元が大きすぎます」というエラーを出して画像のコンパイルを拒否します。
これを修正する方法を知っている人はいますか?
ありがとう!
答え1
エラーdimension too large
が表示されるのは、あなたのアプローチでは巨大なを使用する必要があるためです\k
。交差点を計算する必要がないという点では caverac に同意しますが、円の中心を計算する点には同意しません。あなたのコードでは、これらは交差点にあります (ちなみに、これは で簡単に取得できますtangent cs:
)。原則として、完全な円を描く必要はなく、円弧だけを描く必要がありますが、Ti の方法がけZ は 360 度を超える角度を扱いますが、これを機能させることができませんでした。アップデートgrok に多大な感謝を捧げます: 除算方法の順序を変更しました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}
答え2
円の中心を直接計算して切り取るだけで、円弧を描く必要がなくなります。
そしてこれがコードです
\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}