Сюжет пытается нарисовать сочленения и звенья роботизированного манипулятора. Изначально я определил точки для сочленений как node
s, и это привело к некоторому сдвигу, когда позже между ними были нарисованы линии. Основываясь на ответах SE, я изменил это на трехэтапный процесс, где я сначала определил 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
Другая возможность - это "одношаговый" подход, который (на мой взгляд) более понятен и прост. Для этого я использую библиотеку 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}