在 Tikz 中用圆圈填充正方形

在 Tikz 中用圆圈填充正方形

我的目标是画一个带圆圈的正方形 - 从正方形的左下角开始,后续圆圈的半径和位置(当然要乘以相应的循环变量,以便在每一步中将其进一步移动一步)是正方形一边的长度除以圆圈的数量。我当前的示例仍然将循环运行得过远了一步,因为我仍在尝试找到将圆圈数减少 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}

相关内容