我正在绘制一些具有许多旋转组件的机械系统图表。对于每个组件,我都附加了一个坐标系,该坐标系通常随组件旋转。我使用 draw 命令绘制坐标,并使用 node 命令添加标签(x
和y
)。我希望轴标签与轴对齐(即箭头直接指向它),无论坐标系如何旋转。目前我已经完成了:
\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>}
第一个参数是旋转角度;参数二、三和四用于指定坐标系的三个点,第五个参数用于设置命令中坐标内部使用的前缀。另外两个可选参数允许更改使用的标签(参见示例代码)。