La trama intenta dibujar las articulaciones y eslabones de un manipulador robótico. Inicialmente definí los puntos para las uniones como node
s y esto resultó en cierto cambio cuando luego se dibujaron líneas entre ellas. Según las respuestas de SE, cambié esto a un proceso de tres pasos en el que primero definí coordinate
s, luego dibujé uniones en las coordenadas y luego las conecté con líneas.
Sin embargo, ahora las líneas van dentro del porro. Quiero tener la propiedad de los nodos donde las líneas se dibujan solo hasta los bordes del nodo.y¿La propiedad de las coordenadas donde las líneas se dibujan exactamente en la coordenada? (Me doy cuenta de que puedo simplemente dibujar las uniones después de dibujar los enlaces, sobrescribiéndolos así, pero prefiero tener los nodos como círculos vacíos como en esta figura por otras razones)
Cómo logro esto.
MWE y resultados con nodos y coordenadas a continuación.
\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}
Respuesta1
Otra posibilidad es el enfoque de "un solo paso", que es (en mi opinión) más claro y sencillo. Para ello utilizo la 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: La solución propuesta anteriormente tiene solo una imagen de Tikz frente a tres en su enfoque. Con él tienes tres imágenes independientes que se superponen entre sí. En esto parece perderse cierta información para dibujar correctamente los nodos.
Respuesta2
Podrías dibujar el camino 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}
Respuesta3
Quizás puedas considerar usar chains
la biblioteca para este tipo de gráficos. Al mismo tiempo que agregas elementos a la cadena, se dibujan las uniones entre ellos.
\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}
Actualizar
El uso chains
no limita ninguna relación de ubicación entre nodos. Es posible colocar todos los nodos y luego sobre chain
ellos, o simplemente colocarlos donde quieras mientras se forman los chain
y joining
entre ellos.
\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}