このプロットは、ロボットマニピュレータのジョイントとリンクを描画しようとしています。 最初、ジョイントのポイントをnode
s として定義しましたが、後でそれらの点の間に線を描画したときに、多少のずれが生じました。 SE からの回答に基づいて、これを 3 段階のプロセスに変更しました。最初にcoordinate
s を定義し、次に座標にジョイントを描画し、後で線で接続しました。
しかし、線はジョイントの内側に入ってしまいます。線がノードの境界までしか描画されないノードの特性を持たせたいのです。そして座標の特性で、線が座標に正確に描画されますか? (リンクを描画した後にジョイントを描画するだけで上書きできることはわかっていますが、他の理由から、この図のようにノードを塗りつぶされていない円にすることを好みます)
これを実現するにはどうすればいいでしょうか。
MWE と結果は、以下のノードと座標とともに表示されます。
\documentclass[tikz]{standalone}
\usetikzlibrary{math}
\begin{document}
\foreach \mynodes/\numnodes in {{1/0,2/90,3/0}/3}{%
\begin{tikzpicture}[scale=1]
\draw (-1,-1) [help lines] grid (3,2);
% define coordinates for joints
\node (0,0)(n0){};
\path (0,0)
foreach \nodeid/\nodeangle in \mynodes{
++(\nodeangle:1) node(n\nodeid){}
};
%draw links
\draw [red, ultra thick](0,0)
foreach \nodeid in {1,...,\numnodes}{
-- (n\nodeid)
};
%draw joints
\foreach \nodeid in {0,1,...,\numnodes}{%
\draw [black, thick](n\nodeid) circle [radius=1mm];
};
\end{tikzpicture}
}
\end{document}
答え1
もう 1 つの可能性は「ワンステップ」アプローチです。これは (私の意見では) より明確でシンプルです。そのために、私は TikZ ライブラリを使用しますcalc
。
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[
every node/.style = {circle, draw=red, thick,
minimum size=2mm, inner sep=0pt}
]
\draw (-1,-1) [help lines] grid (3,2);
% graph
\node (n1) at (0,0) {};
\foreach \nodeangle [count=\lastid from 1, count=\nodeid from 2] in {0,90,0}
{
\node (n\nodeid) at ($(n\lastid) + (\nodeangle:10mm)$) {};
\draw (n\lastid) -- (n\nodeid);
}
\end{tikzpicture}
\end{document}
結果:
編集: 上記で提案されたソリューションには、あなたのアプローチの 3 つとは対照的に、Tikz 画像が 1 つしかありません。これにより、互いに重なり合う 3 つの独立した画像が作成されます。これにより、ノードを適切に描画するための一部の情報が失われているようです。
答え2
パスを部分的に描くこともできます。
\documentclass[tikz]{standalone}
\usetikzlibrary{math}
\begin{document}
\foreach \mynodes/\numnodes in {{1/0,2/90,3/0}/3}{%
\begin{tikzpicture}[scale=1]
\draw (-1,-1) [help lines] grid (3,2);
% define coordinates for joints
\node (0,0)(n0){};
\path (0,0)
foreach \nodeid/\nodeangle in \mynodes{
++(\nodeangle:1) node(n\nodeid){}
};
%draw links
\foreach \nodeid in {1,...,\numnodes}{
\draw [red, ultra thick](n\the\numexpr\nodeid-1) --(n\nodeid);
};
%draw joints
\foreach \nodeid in {0,1,...,\numnodes}{%
\draw [black, thick](n\nodeid) circle [radius=1mm];
};
\end{tikzpicture}
}
\end{document}
答え3
おそらく、chains
この種のグラフにはライブラリの使用を検討できます。チェーンに要素を追加すると同時に、それらの間の結合が描画されます。
\documentclass[tikz, border=2mm]{standalone}
\usetikzlibrary{chains}
\begin{document}
\begin{tikzpicture}[%
on grid,
scale=1,
start chain=going right,
every join/.style={thick, red, shorten >=1pt, shorten <=1pt},
item/.style={
draw,
thick,
on chain,
circle,
minimum size=3mm,
inner sep=0pt,
join
}
]
\draw (-1,-1) [help lines] grid (3,2);
\node [item] {};
\node [item] {};
\node [item, on chain= going above] {};
\node [item] {};
\end{tikzpicture}
\end{document}
アップデート
を使用するとchains
、ノード間の配置関係が制約されることはありません。すべてのノードを後でそれらの上に配置することも、ノード間にand をchain
形成しながら任意の場所に配置することもできます。chain
joining
\documentclass[tikz, border=2mm]{standalone}
\usetikzlibrary{chains}
\begin{document}
\begin{tikzpicture}[%
scale=1,
start chain,
every join/.style={thick, red, shorten >=1pt, shorten <=1pt},
item/.style={
draw,
thick,
on chain,
circle,
minimum size=3mm,
inner sep=0pt,
join
}
]
\foreach \i in {1,...,5}
\node [item] (\i) at (3*rand,3*rand) {};
\end{tikzpicture}
\end{document}