我的目标是画一个带圆圈的正方形 - 从正方形的左下角开始,后续圆圈的半径和位置(当然要乘以相应的循环变量,以便在每一步中将其进一步移动一步)是正方形一边的长度除以圆圈的数量。我当前的示例仍然将循环运行得过远了一步,因为我仍在尝试找到将圆圈数减少 1 的最漂亮方法。
\begin{tikzpicture}
\coordinate (a) at (0,0);
\coordinate (b) at (4,0);
\coordinate (c) at (4,4);
\coordinate (d) at (0,4);
\def\circles{5}
\draw[gray, thick] (a) -- (b) -- (c) -- (d) -- (a);
\tikzmath{
coordinate \c;
\c = (b) - (a);
\length = sqrt((\cx) ^ 2 + (\cy) ^ 2) / \circles;
\radius = \length / 2;
}
\foreach \i in {0,...,\circles}
{
\pgfmathtruncatemacro{\x}{\i * \length};
\foreach \j in {0,...,\circles}
{
\pgfmathtruncatemacro{\y}{\j * \length};
% \draw[gray, thick] (\x, \y) circle[radius=\radius pt];
\draw[gray, thick] (\x pt, \y pt) circle[radius=\radius pt]; % proposed fix by AndrewStacey - still I don't understand why the radius is also fixed by a fix of the position of each circle
}
}
\end{tikzpicture}
因此,我希望得到正方形边界上以及正方形内部相切的圆的平方数。我猜计算距离时发生了一些奇怪的事情,但我不知道发生了什么,也不知道如何解决。
按照 Andrew Stacey 的说法使用 pt 可得到以下结果:
这样好多了。但我仍然希望实现最佳效果,即每个圆都接触一个点,并且圆心完全对齐。我猜错误发生的原因是 tikz 只使用整数,而我的解决方案依赖于浮点数。但我仍然不知道如何做得更好。
答案1
圆的尺寸不对,因为\tikzmath
在 中可以工作pt
,但返回的数字只是数字,所以\radius
是裸数字,即在 中测量的所需半径pt
。然后当您使用像 这样的坐标时(\x, \y)
,这些只是数字,因此在当前坐标轴中进行解释。如果没有进行任何变换,那么这些就是cm
。所以你的数字太大了。使用(\x pt, \y pt)
表示数字将被解释为pt
。
然后循环内的计算就出现了问题。使用 ,\pgfmathtruncatemacro
您将对答案进行四舍五入。要么使用,要么通过上的键\pgfmathsetmacro
进行计算。evaluate
\foreach
\documentclass{article}
%\url{https://tex.stackexchange.com/q/620551/86}
\usepackage{tikz}
\usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}
\coordinate (a) at (0,0);
\coordinate (b) at (4,0);
\coordinate (c) at (4,4);
\coordinate (d) at (0,4);
\def\circles{5}
\draw[gray, thick] (a) -- (b) -- (c) -- (d) -- (a);
\tikzmath{
coordinate \c;
\c = (b) - (a);
\length = sqrt((\cx) ^ 2 + (\cy) ^ 2) / \circles;
\radius = \length / 2;
}
\foreach[evaluate=\i as \x using \i * \length]
\i in {0,...,\circles}
{
% \pgfmathsetmacro{\x}{\i * \length}
\foreach[evaluate=\j as \y using \j * \length]
\j in {0,...,\circles}
{
% \pgfmathsetmacro{\y}{\j * \length}
\draw[gray, thick] (\x pt, \y pt) circle[radius=\radius pt];
}
}
\end{tikzpicture}
\end{document}
答案2
这是另一种方法。从视觉上看,它是相同的,即一个\circles
圆圈网格,上面有一个最大的正方形。所以,正方形的边长没有给出(也不是它的顶点),但它将依赖于\circles
。
如果需要一个边固定的正方形,我的解决方案就不起作用。
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\def\circles{5}
\begin{document}
\begin{tikzpicture}
\foreach \i in {1,...,\circles}{%
\foreach \j in {1,...,\circles}{%
\draw (\i,\j) circle [radius=.5cm];
}}
\draw[thick] (1,1) rectangle (\circles, \circles);
\end{tikzpicture}
\end{document}