узлы против координат. Линии рисуются внутри узлов

узлы против координат. Линии рисуются внутри узлов

Сюжет пытается нарисовать сочленения и звенья роботизированного манипулятора. Изначально я определил точки для сочленений как nodes, и это привело к некоторому сдвигу, когда позже между ними были нарисованы линии. Основываясь на ответах SE, я изменил это на трехэтапный процесс, где я сначала определил coordinates, затем нарисовал сочленения в координатах, а затем соединил их линиями.

Однако теперь линии идут внутри стыка. Я хочу иметь свойство узлов, где линии рисуются только до границ узлаисвойство координат, при котором линии рисуются точно по координатам? (Я понимаю, что могу просто нарисовать суставы после рисования связей, тем самым перезаписав их, но я предпочитаю иметь узлы в виде незаполненных кругов, как на этом рисунке, по другим причинам)

Как этого добиться?

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}

введите описание изображения здесь

Связанный контент