TikZ 錯誤計算了一些交點,尺寸太大

TikZ 錯誤計算了一些交點,尺寸太大

我想在圓內畫一些弧:對於所有 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在方法中使用巨大的。我同意卡韋拉克的觀點,因為你不必計算交點,但我不同意計算圓心。在您的程式碼中,這些位於交叉點(順便說一句,可以使用 更輕鬆地獲得tangent cs:)。原則上你不必繪製完整的圓,而只需繪製圓弧,但由於 Ti 的方式kZ 處理超過 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}

在此輸入影像描述

相關內容