
나는 원 안에 몇 개의 호를 그리고 싶습니다. 모든 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=32)에서는 일부 원이 올바르게 배치되지 않았습니다. j=64의 경우 TikZ는 "치수가 너무 큼" 오류로 인해 그림 컴파일을 거부합니다.
누군가 이 문제를 해결하는 방법을 알고 있나요?
감사해요!
답변1
접근 방식에 dimension too large
엄청난 양을 사용해야 하기 때문에 오류가 나타납니다 . \k
나는 교차점을 계산할 필요가 없다는 점에서 카버락의 의견에 동의하지만, 원의 중심을 계산하는 데는 동의하지 않습니다. 귀하의 코드에서 이들은 교차점에 있습니다 (BTW는 로 더 쉽게 얻을 수 있음 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}