Círculos tangentes usando TikZ

Círculos tangentes usando TikZ

Estoy intentando utilizar TikZ para dibujar círculos tangentes contenidos en un rectángulo, pero he encontrado algunas dificultades. También solicito comentarios generales sobre cómo usar mejor TikZ, por lo que aquí doy bastantes detalles sobre mi enfoque.

Comencé haciendo el rectángulo exterior usando \draw (0,0) -- ++(0,-6) -- ++(10,0) -- ++(0,6) -- cycle;. Luego hice la primera fila de círculos usando \tikz\foreach \x in {0,2,4,6} \draw (\x,0) circle (1);. Noté que los círculos estaban colocados en la línea superior del rectángulo, así que supuse que las coordenadas (\x,0)eran para elabajode cada círculo, no elcentrocomo hubiera esperado (aunque incluso si fueran para el centro, igual habría necesitado moverlos hacia abajo). Cambié la primera coordenada del rectángulo porque (0,3)también quería un recuadro antes de los círculos. Pero entonces el dibujo invadió el texto que tenía encima. Cambié la primera coordenada (0,0)y en su lugar ajusté las coordenadas de los círculos a (\x,-3). Pero entonces los círculos volvieron a estar encima del rectángulo y todo el dibujo ascendió considerablemente en la página. ¿Por qué pasó esto?

Cambié las coordenadas de los círculos nuevamente a (\x,0)y el rectángulo nuevamente a (0,3). Luego intenté hacer la segunda fila de círculos. Como los quería empacados en una celosía hexagonal, escribí foreach \x in {1,3,5,7 \draw (\x,{-sqrt(3)}) circle (1);, quepensamientoproduciría cuatro círculos más, una unidad a la derecha y √3 unidades debajo de la primera fila. En cambio, estaban alineados horizontalmente con la primera fila y un poco más abajo de lo que quería. Reescribí las coordenadas como (\x+1,{-sqrt(3)+1}), lo cual funcionó, pero ¿por qué? Supuse que esto significaba que \xlas coordenadas debían serrelativoa su posición en la serie {1,3,5,7}, así que esperaba que intercambiar la serie {0,2,4,6}tuviera el mismo resultado, pero no, no fue así. Y la posición vertical viene dada por un valor fijo en las coordenadas, y sé que la segunda fila de círculos debe estar √3 unidades por debajo de la primera, no (√3 - 1) unidades por debajo. ¿Qué estoy haciendo mal?

En última instancia, quiero dibujar una tercera fila de círculos, marcar el centro de cada círculo, hacer que los bordes del rectángulo recorten los semicírculos que sobresalen y agregar algunas anotaciones para el radio y otras cosas, por lo que también me preguntaba si estos pasos servirían. Sería más corto si hiciera los círculos como nodos o algo más. Ya he pasado mucho tiempo revisando el manual de TikZ. Vi algunas soluciones posibles como usar la intersectionsbiblioteca o tangentdesde la calcbiblioteca, pero no estoy segurocómoYo los usaría. Dado que el manual tiene más de 1300 páginas, puede resultar difícil para un principiante en TikZ buscar respuestas a preguntas específicas. También verifiqué las respuestas en Stack Exchange pero todavía no sabía qué hacer.


Mi 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}

Producción

producción

Respuesta1

Tus cálculos son correctos, pero al usar \tikz\foreachtus nidos tikzpicture, lo que explica la inconsistencia.

Esto dibuja una tercera fila y fija las posiciones de los otros círculos. Para el rectángulo puedes usar la rectangleconstrucción del camino.

\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}

ingrese la descripción de la imagen aquí

Y esto agrega más círculos, marca los centros y recorta los círculos contra el rectá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}

ingrese la descripción de la imagen aquí

Respuesta2

¿Es esto lo que estás buscando?

ingrese la descripción de la imagen aquí

Puede utilizarlo \clip[draw]para dibujar un rectángulo y recortarlo. Aparte de esto, utilicé dos \foreachbucles y, como el gato de Schrödinger, eliminé los internos extraños \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}

También solía \pgfmathsetmarcoestablecer la altura del rectángulo en 2+2\sqrt(3).

información relacionada