
Estou tentando usar o TikZ para desenhar círculos tangentes contidos em um retângulo, mas encontrei algumas dificuldades. Também estou solicitando feedback geral sobre como usar melhor o TikZ, por isso estou fornecendo muitos detalhes sobre minha abordagem aqui.
Comecei fazendo o retângulo externo usando \draw (0,0) -- ++(0,-6) -- ++(10,0) -- ++(0,6) -- cycle;
. Então fiz a primeira linha de círculos usando \tikz\foreach \x in {0,2,4,6} \draw (\x,0) circle (1);
. Percebi que os círculos foram colocados na linha superior do retângulo, então presumi que as coordenadas (\x,0)
eram para ofundode cada círculo, não oCentrocomo eu esperava (embora mesmo que fossem para o centro, eu ainda precisaria movê-los para baixo). Mudei a primeira coordenada do retângulo para (0,3)
porque também queria uma inserção antes dos círculos. Mas então o desenho invadiu o texto acima dele. Alterei a primeira coordenada de volta para (0,0)
e, em vez disso, ajustei as coordenadas dos círculos para (\x,-3)
. Mas então os círculos estavam novamente acima do retângulo, e todo o desenho subiu consideravelmente na página. Por quê isso aconteceu?
Mudei as coordenadas dos círculos de volta para (\x,0)
e do retângulo de volta para (0,3)
. Em seguida, tentei fazer a segunda linha de círculos. Como eu queria que eles fossem embalados em uma estrutura hexagonal, escrevi foreach \x in {1,3,5,7 \draw (\x,{-sqrt(3)}) circle (1);
, quepensamentoproduziria mais quatro círculos, uma unidade à direita e √3 unidades abaixo da primeira linha. Em vez disso, eles estavam alinhados horizontalmente com a primeira linha e um pouco mais abaixo do que eu queria. Reescrevi as coordenadas como (\x+1,{-sqrt(3)+1}), que funcionou, mas por quê? Eu imaginei que isso significava que \x
as coordenadas deveriam serrelativoà sua posição na série {1,3,5,7}
, então eu esperava que a troca da série com {0,2,4,6}
tivesse o mesmo resultado, mas não, não teve. E a posição vertical é dada por um valor fixo nas coordenadas, e eu sei que a segunda linha de círculos deve estar √3 unidades abaixo da primeira, e não (√3 - 1) unidades abaixo. O que estou fazendo de errado?
Por fim, quero desenhar uma terceira linha de círculos, marcar o centro de cada círculo, fazer com que as bordas do retângulo cortem os semicírculos salientes e adicionar algumas anotações para o raio e outras coisas, então também queria saber se essas etapas seriam seria mais curto se eu fizesse os círculos como nós ou qualquer outra coisa. Já passei muito tempo examinando o manual do TikZ. Vi algumas soluções possíveis como usar a intersections
biblioteca ou tangent
da calc
biblioteca, mas não tenho certezacomoEu os usaria. Como o manual tem mais de 1.300 páginas, pode ser difícil para um novato no TikZ procurar respostas para perguntas específicas. Também verifiquei as respostas no Stack Exchange, mas ainda não consegui descobrir o que fazer.
Meu código
\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}
Saída
Responder1
Sua matemática está certa, mas usando \tikz\foreach
você nest tikzpicture
s, o que explica a inconsistência.
Isto desenha uma terceira linha e fixa as posições dos outros círculos. Para o retângulo você pode simplesmente usar a rectangle
construção do caminho.
\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}
E isso adiciona mais círculos, marca os centros e recorta os círculos no retângulo.
\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}
Responder2
É isso que você está procurando?
Você pode usar \clip[draw]
para desenhar um retângulo e recortá-lo. Além disso, usei dois \foreach
loops e, como o gato de Schrödinger, excluí o internal estranho \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}
Eu também costumava \pgfmathsetmarco
definir a altura do retângulo como 2+2\sqrt(3)
.