
Я пытаюсь использовать 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
библиотеки, но я не уверенкакЯ бы их использовал. Поскольку руководство содержит более 1300 страниц, новичку в 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
s объясняет несоответствие.
Это рисует третью строку и фиксирует позиции других кругов. Для прямоугольника вы можете просто использовать 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)
.