A trama tenta desenhar as juntas e elos de um manipulador robótico. Inicialmente defini os pontos para as juntas como node
se isso resultou em alguma mudança quando linhas foram posteriormente traçadas entre elas. Com base nas respostas do SE, mudei isso para um processo de três etapas onde primeiro defini coordinate
s, depois desenhei juntas nas coordenadas e depois as conectei com linhas.
Porém, agora as linhas vão para dentro da junta. Quero ter a propriedade dos nós onde as linhas são desenhadas apenas até as bordas do nóea propriedade das coordenadas onde as linhas são desenhadas exatamente na coordenada? (Sei que posso simplesmente desenhar as juntas depois de desenhar os links, substituindo-os, mas prefiro ter os nós como círculos não preenchidos como nesta figura por outros motivos)
Como faço para conseguir isso.
MWE e resultados com nós e coordenadas abaixo.
\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}
Responder1
Outra possibilidade é a abordagem “em uma etapa”, que é (na minha opinião) mais clara e simples. Para isso eu uso a biblioteca 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}
Resultado:
Editar: A solução proposta acima tem apenas uma imagem Tikz contra três em sua abordagem. Com ele você tem três imagens independentes que se sobrepõem umas às outras. Nisto algumas informações para o desenho adequado dos nós parecem ser perdidas.
Responder2
Você poderia desenhar o caminho por partes:
\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}
Responder3
Pode ser que você considere usar chains
uma biblioteca para esse tipo de gráfico. Ao mesmo tempo que você adiciona elementos à cadeia, são desenhadas junções entre eles.
\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}
Atualizar
O uso chains
não restringe nenhuma relação de posicionamento entre nós. É possível colocar todos os nós e posteriormente sobre chain
eles, ou apenas colocá-los onde quiser enquanto estão formando o chain
e joining
entre eles.
\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}