TikZ:绘图环境中的节点位置

TikZ:绘图环境中的节点位置

我正在绘制一些具有许多旋转组件的机械系统图表。对于每个组件,我都附加了一个坐标系,该坐标系通常随组件旋转。我使用 draw 命令绘制坐标,并使用 node 命令添加标签(xy)。我希望轴标签与轴对齐(即箭头直接指向它),无论坐标系如何旋转。目前我已经完成了:

\documentclass{standalone}
    \usepackage{tikz}
\begin{document}
    \begin{tikzpicture}
        \draw[<->,rotate around={22.5:(0,0)}](0,1)node[above]{$y$}--(0,0.2)--(1,0.2)node[right]{$x$};
    \end{tikzpicture}
\end{document}

此代码产生以下输出:

在此处输入图片描述

TikZ 似乎node[above]使用标准坐标将其解释为上方,而不是“旋转”节点位于线末端上方的含义。我理想情况下希望能够编写类似node[angle=22.5]正确定位标签的内容。有没有办法做到这一点,我可以指定角度,而不仅仅是上方、右侧等?

答案1

你尝试过类似的事情node[pos=xx]吗?

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
    \draw[<->,rotate around={22.5:(0,0)}] 
        (0,1) --(0,0.2) node[pos=-0.2] {$y$}
        -- (1,0.2) node[pos=1.2] {$x$};
\end{tikzpicture}
\end{document}

示例输出

pos节点的键将其放置在沿着线段的该位置。 是pos=0开始,pos=1是结束。 pos=0.5是中间,有时有用,但在这里不有用。

我们需要将节点放置在线段开头之前和之后一点的位置。因此,我们从 中减去一点0,并从 中加上一点1

这里的缺点是,您获得的分离只是线段长度的一小部分。因此,如果您想要与末端保持固定距离,则可能需要寻找另一种方法。

答案2

如果我是你,PSTricks 将是我的首选。

\rput具有用于旋转的角度参数。如果我们在角度前加上 *,则旋转将是绝对的。例如,考虑\rput{60}(0,0){\rput{*45}(0,0){Object}}。对象将旋转 45 度而不是 105 度。

\documentclass[pstricks,border=12pt,12pt]{standalone}

\def\Axes{%
\pspicture(-3.5,-3.5)(3.5,3.5)
    \psline{<->}(3;0)(0,0)(3;90)
    \rput{*0}(3.3;0){$x$}
    \rput{*0}(3.3;90){$y$}
\endpspicture}

\begin{document}
\foreach \a in {0,30,...,330}{%
\pspicture(-4,-4)(4,4)
\rput{\a}(0,0){\Axes}
\rput(0,4){Rotation $\a^\circ$}
\endpspicture}
\end{document}

在此处输入图片描述

答案3

您无需指定角度;TikZ 可以为您进行计算!这里有一个选项,可以保证标签与线段末端的距离相同,并且方向正确(每个线段的方向):

在此处输入图片描述

代码:

\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xparse}

\newlength\mylena
\newlength\mylenb

\NewDocumentCommand\Rotcs{mmmmmO{x}O{y}}{
\draw[<->,rotate around={#1:(0,0)}] 
  #2 coordinate (rotcs#5a) -- 
  #3 coordinate (rotcs#5b) -- 
  #4 coordinate (rotcs#5c);
\path let
  \p1=( $ (rotcs#5b) - (rotcs#5a) $ ), 
  \p2=( $ (rotcs#5b) - (rotcs#5c) $ ) in 
  \pgfextra{\pgfmathsetlength\mylena{veclen(\x1,\y1)}}
  \pgfextra{\pgfmathsetlength\mylenb{veclen(\x2,\y2)}}
  node at ($ (rotcs#5b)!\mylena+6pt!(rotcs#5a) $ ) {$#6$}
  node at ($ (rotcs#5b)!\mylenb+6pt!(rotcs#5c) $ ) {$#7$};
}

\begin{document}
\begin{tikzpicture}
\Rotcs{22.5}{(0,1)}{(0,0.2)}{(0.5,0.2)}{w}
\begin{scope}[xshift=1.5cm]
\Rotcs{22.5}{(0,1)}{(0,0.2)}{(3,0.2)}{z}
\end{scope}
\begin{scope}[xshift=5cm]
\Rotcs{60}{(0,1)}{(0,0.2)}{(3,0.2)}{z}
\end{scope}
\begin{scope}[xshift=8cm]
\Rotcs{160}{(0,3)}{(0,0)}{(1,0)}{z}
\end{scope}
\end{tikzpicture}

\end{document}

评论

  • 这个解决方案背后的想法很简单;假设我们有两个坐标(A)(B);我们使用距离修饰符(A)!<length>!(B)将标签放置在从到的线段中,(A)距离(B)<length>(A)诀窍是计算适当的值,即从到加上的<length>线段的长度。(A)(B)6pt

  • \Rotcs 命令有 5 个强制参数:

    \Rotcs{<angle>}{<point1>}{<point2>}{<point3>}{<prefix>}
    

    第一个参数是旋转角度;参数二、三和四用于指定坐标系的三个点,第五个参数用于设置命令中坐标内部使用的前缀。另外两个可选参数允许更改使用的标签(参见示例代码)。

相关内容