플롯에서는 로봇 조작기의 관절과 링크를 그리려고 합니다. 처음에는 관절의 점을 node
s로 정의했는데 나중에 그 사이에 선을 그릴 때 약간의 이동이 발생했습니다. SE의 답변을 바탕으로 이를 먼저 coordinate
s를 정의한 다음 좌표에 관절을 그리고 나중에 선으로 연결하는 3단계 프로세스로 변경했습니다.
그러나 이제 선이 접합부 내부로 들어갑니다. 노드의 테두리까지만 선이 그려지는 노드의 속성을 갖고 싶습니다.그리고좌표에 정확히 선이 그려지는 좌표의 속성? (링크를 그린 후 간단히 조인트를 그려서 덮어쓸 수 있다는 것을 알고 있지만, 다른 이유로 인해 이 그림처럼 노드를 채워지지 않은 원으로 만드는 것을 선호합니다)
이것을 어떻게 달성합니까?
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}
결과:
편집하다: 위에서 제안한 솔루션에는 접근 방식에 반대되는 세 개의 Tikz 그림이 하나만 있습니다. 그것으로 당신은 서로 지나치게 겹쳐지는 세 개의 독립적인 사진을 갖게 됩니다. 이 경우 노드를 올바르게 그리기 위한 일부 정보가 손실된 것 같습니다.
답변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
노드 간의 배치 관계가 제한되지 않습니다. 모든 노드를 나중에 그 위에 배치할 수도 있고, 노드 와 노드 사이를 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}