Tangentialkreise mit TikZ

Tangentialkreise mit TikZ

Ich versuche, mit TikZ Kreise zu zeichnen, die in einem Rechteck liegen, aber ich bin dabei auf einige Schwierigkeiten gestoßen. Ich bitte auch um allgemeines Feedback zur besseren Verwendung von TikZ, daher gebe ich hier ziemlich viele Details zu meinem Ansatz an.

Ich begann mit dem Erstellen des äußeren Rechtecks ​​mithilfe von \draw (0,0) -- ++(0,-6) -- ++(10,0) -- ++(0,6) -- cycle;. Dann erstellte ich die erste Reihe von Kreisen mithilfe von \tikz\foreach \x in {0,2,4,6} \draw (\x,0) circle (1);. Ich bemerkte, dass die Kreise auf der oberen Linie des Rechtecks ​​platziert waren, also nahm ich an, dass die Koordinaten (\x,0)für dieuntenjedes Kreises, nicht derCenterwie ich es erwartet hätte (obwohl ich sie auch nach unten hätte verschieben müssen, wenn sie für die Mitte gewesen wären). Ich änderte die erste Koordinate des Rechtecks ​​auf , (0,3)da ich auch einen Einzug vor den Kreisen wollte. Aber dann ragte die Zeichnung in den darüber liegenden Text hinein. Ich änderte die erste Koordinate zurück auf (0,0)und passte stattdessen die Koordinaten der Kreise auf an (\x,-3). Aber dann waren die Kreise wieder über dem Rechteck und die ganze Zeichnung wanderte erheblich nach oben auf der Seite. Warum ist das passiert?

Ich änderte die Koordinaten der Kreise zurück auf (\x,0)und des Rechtecks ​​zurück auf (0,3). Dann versuchte ich, die zweite Reihe von Kreisen zu erstellen. Da ich sie in einem hexagonalen Gitter packen wollte, schrieb ich foreach \x in {1,3,5,7 \draw (\x,{-sqrt(3)}) circle (1);, was ichGedankewürde vier weitere Kreise erzeugen, eine Einheit rechts von und √3 Einheiten unterhalb der ersten Reihe. Stattdessen waren sie horizontal mit der ersten Reihe ausgerichtet und ein ganzes Stück weiter unten, als ich wollte. Ich habe die Koordinaten als (\x+1,{-sqrt(3)+1}) umgeschrieben, was funktionierte, aber warum? Ich vermutete, dass dies bedeutete, dass die \xin den Koordinaten sein musstenrelativzu seiner Position in der Reihe {1,3,5,7}, also erwartete ich, dass das Vertauschen der Reihe mit {0,2,4,6}das gleiche Ergebnis hätte, aber nein, das tat es nicht. Und die vertikale Position wird durch einen festen Wert in den Koordinaten angegeben, und ich weiß, dass die zweite Reihe von Kreisen √3 Einheiten unter der ersten liegen sollte, nicht (√3 - 1) Einheiten darunter. Was mache ich falsch?

Letztendlich möchte ich eine dritte Reihe von Kreisen zeichnen, den Mittelpunkt jedes Kreises markieren, die Kanten des Rechtecks ​​die überhängenden Halbkreise abschneiden lassen und einige Anmerkungen für den Radius und andere Dinge hinzufügen. Daher habe ich mich auch gefragt, ob diese Schritte kürzer wären, wenn ich die Kreise als Knoten oder etwas anderes erstellen würde. Ich habe bereits viel Zeit damit verbracht, das TikZ-Handbuch durchzusehen. Ich habe einige mögliche Lösungen gesehen, wie die Verwendung der intersectionsBibliothek oder tangentaus der calcBibliothek, aber ich bin mir nicht sicherWieIch würde sie verwenden. Da das Handbuch mehr als 1.300 Seiten umfasst, kann es für einen TikZ-Neuling schwierig sein, Antworten auf bestimmte Fragen nachzuschlagen. Ich habe auch Antworten auf Stack Exchange überprüft, konnte aber immer noch nicht herausfinden, was zu tun ist.


Mein Code

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

Ausgabe

Ausgabe

Antwort1

Ihre Mathematik ist richtig, aber durch die Verwendung \tikz\foreachvon „nest tikzpictures“, was die Inkonsistenz erklärt.

Dadurch wird eine dritte Reihe gezeichnet und die Positionen der anderen Kreise werden fixiert. Für das Rechteck kann einfach die rectanglePfadkonstruktion verwendet werden.

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

Bildbeschreibung hier eingeben

Dadurch werden weitere Kreise hinzugefügt, die Mittelpunkte markiert und die Kreise an das Rechteck angepasst.

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

Bildbeschreibung hier eingeben

Antwort2

Suchst du danach?

Bildbeschreibung hier eingeben

Sie können \clip[draw]ein Rechteck zeichnen und es dann an das Rechteck anheften. Außerdem habe ich zwei \foreachSchleifen verwendet und wie Schrödingers Katze die überflüssigen internen Elemente gelöscht \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}

Ich habe \pgfmathsetmarcodie Höhe des Rechtecks ​​auch auf eingestellt 2+2\sqrt(3).

verwandte Informationen