
私は、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)
。次に、2列目の円を作成しようとしました。円を六角形の格子に詰めたかったため、foreach \x in {1,3,5,7 \draw (\x,{-sqrt(3)}) circle (1);
と書きました。考えすると、最初の行の右に1単位、下に√3単位の位置に、さらに4つの円が生成されるはずでした。しかし、最初の行と水平に並んでいて、私が望んでいたよりもかなり下の方でした。座標を(\x+1,{-sqrt(3)+1})と書き直したところ、うまくいきましたが、なぜでしょうか? これは、\x
座標の が相対的を の系列内の位置に置いたので{1,3,5,7}
、 を と入れ替えても{0,2,4,6}
同じ結果になると思っていましたが、そうではありませんでした。また、垂直位置は座標の固定値で与えられ、2 列目の円は 1 列目より √3 単位下になるべきであり、(√3 - 1) 単位下になるべきではないことはわかっています。何が間違っているのでしょうか?
最終的には、3列目の円を描き、各円の中心をマークし、長方形の端で半円を切り取り、半径などの注釈を追加したいのですが、円をノードまたは他の何かとして作成すると、これらの手順が短くなるかどうかも気になります。私はすでに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
矛盾が生じます。
これにより、3 行目が描画され、他の円の位置が固定されます。長方形の場合は、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]
を使用して長方形を描き、長方形にクリップすることができます。これとは別に、2 つの\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)
。