我正在尝试使用 TikZ 绘制矩形内的相切圆,但遇到了一些困难。我还在征求有关更好地使用 TikZ 的一般反馈,因此我在这里详细介绍了我的方法。
我首先使用 制作外矩形\draw (0,0) -- ++(0,-6) -- ++(10,0) -- ++(0,6) -- cycle;
。然后我使用 制作第一行圆圈\tikz\foreach \x in {0,2,4,6} \draw (\x,0) circle (1);
。我注意到圆圈位于矩形的顶线上,所以我假设坐标(\x,0)
是底部每个圆圈,而不是中心正如我所料(尽管即使它们是中心,我仍然需要将它们向下移动)。我将矩形的第一个坐标更改为,(0,3)
因为我还想在圆圈前插入一个插图。但是这样绘图就侵占了它上面的文本。我将第一个坐标改回为(0,0)
,并将圆圈的坐标调整为(\x,-3)
。但是圆圈又位于矩形上方,整个绘图在页面上大幅上移。为什么会这样?
我将圆的坐标改回为(\x,0)
,将矩形改回为(0,3)
。然后我尝试制作第二排圆。因为我想把它们塞进六边形格子里,foreach \x in {1,3,5,7 \draw (\x,{-sqrt(3)}) circle (1);
所以我写了,我想法会产生另外四个圆圈,在第一行的右侧一个单位处,在第一行的下方√3个单位处。相反,它们与第一行水平对齐,并且比我想要的要靠下很多。我将坐标重写为 (\x+1,{-sqrt(3)+1}),这有效,但为什么呢?我猜这意味着\x
坐标中的相对的到其在系列中的位置{1,3,5,7}
,所以我期望将系列与交换{0,2,4,6}
会产生相同的结果,但事实并非如此。垂直位置由坐标中的固定值给出,我知道第二行圆应该比第一行低 √3 个单位,而不是 (√3 - 1) 个单位。我做错了什么?
最后,我想画第三排圆,标记每个圆的中心,让矩形的边缘夹住悬垂的半圆,并为半径和其他东西添加一些注释,所以我也在想如果我把圆做成节点或其他东西,这些步骤是否会更短。我已经花了很多时间浏览 TikZ 手册。我看到了一些可能的解决方案,比如使用库intersections
或tangent
从calc
库中获取,但我不确定如何我会使用它们。由于手册超过 1,300 页,对于 TikZ 新手来说,查找特定问题的答案可能很困难。我也在 Stack Exchange 上查看了答案,但仍然不知道该怎么做。
我的代码
\documentclass[12pt]{article}
\usepackage[margin=1.25in]{geometry}
\usepackage{amsmath,amsfonts,amsthm,amssymb}
\usepackage{pgf,tikz}
\usetikzlibrary{calc,intersections}
\begin{document}
\begin{flushleft}
\begin{figure}[h]
\begin{tikzpicture}
\draw (0,3) -- ++(0,-6) -- ++(10,0) -- ++(0,6) -- cycle;
\tikz\foreach \x in {0,2,4,6}
\draw (\x,0) circle (1);
\foreach \x in {1,3,5,7}
\draw (\x+1,{-sqrt(3)+1}) circle (1);
\end{tikzpicture}
\end{figure}
\end{flushleft}
\end{document}
输出
答案1
你的数学是正确的,但是通过使用\tikz\foreach
嵌套tikzpicture
,这解释了不一致之处。
这将绘制第三行并固定其他圆的位置。对于矩形,您只需使用rectangle
路径构造即可。
\documentclass[12pt]{article}
\usepackage[margin=1.25in]{geometry}
\usepackage{tikz}
\begin{document}
\begin{figure}[h]
\begin{tikzpicture}
\draw (0,3) rectangle ++(10,-6);
\draw foreach \x in {0,2,4,6}
{(1+\x,2) circle[radius=1]
(1+\x,{2-2*sqrt(3)}) circle[radius=1]};
\draw foreach \x in {1,3,5,7}
{(\x+1,{-sqrt(3)+2}) circle[radius=1]};
\end{tikzpicture}
\end{figure}
\end{document}
这会添加更多圆圈、标记中心并将圆圈剪切到矩形上。
\documentclass[12pt]{article}
\usepackage[margin=1.25in]{geometry}
\usepackage{tikz}
\begin{document}
\begin{figure}[h]
\begin{tikzpicture}[bullet/.style={fill,circle,inner sep=1.2pt}]
\draw[clip] (0,3) rectangle ++(10,-6);
\draw foreach \X in {-1,0,...,9}
{\ifodd\X
(\X+1,{-sqrt(3)+2}) node[bullet]{} circle[radius=1]
(\X+1,{-3*sqrt(3)+2}) node[bullet]{} circle[radius=1]
\else
(\X+1,2) node[bullet]{} circle[radius=1]
(\X+1,{2-2*sqrt(3)}) node[bullet]{} circle[radius=1]
\fi};
\end{tikzpicture}
\end{figure}
\end{document}
答案2
这是你想要的?
您可以使用\clip[draw]
绘制一个矩形并裁剪到矩形。除此之外,我还使用了两个\foreach
循环,并且像薛定谔的猫一样,删除了多余的内部\tikz
。
\documentclass[12pt]{article}
\usepackage[margin=1.25in]{geometry}
\usepackage{amsmath,amsfonts,amsthm,amssymb}
\usepackage{pgf,tikz}
\usetikzlibrary{calc,intersections}
\begin{document}
\begin{flushleft}
\begin{figure}[h]
\begin{tikzpicture}
\pgfmathsetmacro\top{2+2*sqrt(3)}
\clip[draw](0,0) rectangle (10,\top);
\foreach \x in {1,3,5,7,9} {
\foreach \row [
evaluate=\row as \yrow using {1+sqrt(3)*\row},
evaluate=\row as \xrow using {isodd(\row) ? \x+1: \x}
] in {0,1,2} {
\draw (\xrow,\yrow) circle (1);
}
}
\end{tikzpicture}
\end{figure}
\end{flushleft}
\end{document}
我还曾经\pgfmathsetmarco
将矩形的高度设置为2+2\sqrt(3)
。