![在表达式中使用 TikZ 坐标?](https://linux22.com/image/253782/%E5%9C%A8%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%AD%E4%BD%BF%E7%94%A8%20TikZ%20%E5%9D%90%E6%A0%87%EF%BC%9F.png)
我希望能够\coordinate
从两个现有坐标开始计算两个新的 s。我定义了两个坐标c1
和c2
。一个最小的例子是
\documentclass{report}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[x={(.05\textwidth,0)},y={(0,.05\textwidth)}]
\def\arrowlength{0.5}
\coordinate (c1) at (1,0);
\coordinate (c2) at (4,1);
\draw (c1) -- (c2);
\end{tikzpicture}
\end{document}
从这里继续,我想计算第三个坐标,位于和c3
中间。我试过了c1
c2
\coordinate (c3) at (0.5*c1+0.5*c2);
但这给了我错误
Package pgf Error: No shape named 0 is known
其次,我想从 画一个箭头,与和c3
之间的线正交。所以我想取差值,将该向量旋转一定角度,对其进行归一化,将其乘以箭头应有的长度,然后将其添加到并将其存储为名为 的新坐标。这可能吗?(我想避免手动计算坐标,因为我必须多次执行此操作,并且我希望能够轻松地对其进行更改)c1
c2
c2-c1
90
c3
c4
编辑1:感谢 Jake 和 percusse,我意识到我必须将表达式括在 $ 符号中,并将坐标括在括号中。我现在已将最小示例更新为
\documentclass{report}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[x={(.05\textwidth,0)},y={(0,.05\textwidth)}]
\def\arrowlength{0.5}
\coordinate (c1) at (1,0);
\coordinate (c2) at (4,1);
\coordinate (c3) at (5,0);
\coordinate (c4) at ($(c1)!0.5!(c2)$);
\coordinate (c5) at ($(c4)!\arrowlength!90:(c2)$);
\coordinate (c6) at ($(c2)!0.5!(c3)$);
\coordinate (c7) at ($(c6)!\arrowlength!90:(c3)$);
\draw (c1) -- (c2) -- (c3);
\draw[->] (c4) -- (c5);
\draw[->] (c6) -- (c7);
\end{tikzpicture}
\end{document}
产生图像
可以看出,箭头的长度不相等,因此将2cm
(Jake 使用的)替换为0.5
(我假设它会自动使用x
和y
向量,就像所有其他没有单位的坐标一样)显然不起作用。有没有关于如何用“单位长度”来指定箭头长度的想法?((4,1)
例如,坐标在x
- 方向上为 4 个单位长度,在 - 方向上为 1 个单位长度y
)
编辑2:
我根据 Jakes 的建议更新了我的示例
\documentclass{report}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\def\unitlength{0.05\textwidth}
\begin{tikzpicture}[x={(\unitlength,0)},y={(0,\unitlength)}]
\def\arrowlength{0.5*\unitlength}
\coordinate (c1) at (1,0);
\coordinate (c2) at (4,1);
\coordinate (c3) at (5,0);
\coordinate (c4) at ($(c1)!0.5!(c2)$);
\coordinate (c5) at ($(c4)!\arrowlength!90:(c2)$);
\coordinate (c6) at ($(c2)!0.5!(c3)$);
\coordinate (c7) at ($(c6)!\arrowlength!90:(c3)$);
\draw (c1) -- (c2) -- (c3);
\draw[->] (c4) -- (c5);
\draw[->] (c6) -- (c7);
\end{tikzpicture}
\end{document}
现在箭头的长度相同。
答案1
您可以使用calc
库来实现这一点。请参阅第 13.5 节坐标计算手动的。
要获取两个坐标之间的中点,可以使用语法($(A)!0.5!(B)$)
或($0.5*(A)+0.5*(B)$)
。对于旋转矢量,可以使用($(A)!<length>!<angle>:(B)$)
。
\path
正如 Altermundus 在评论中指出的那样,也可以使用命令找到两个坐标之间的中点。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\coordinate (C1) at (0,0);
\coordinate (C2) at (3,2);
%% Use one of the next two lines for calculating the midpoint between two coordinates using the calc library...
\coordinate (C3) at ($(C1)!0.5!(C2)$);
%\coordinate (C3) at ($0.5*(C1)+0.5*(C2)$);
%% Or create coordinates C1, C2 and C3 in one go using a path command (thanks, Altermundus!)
%\path (0,0) coordinate (C1) -- coordinate (C3) (3,2) coordinate (C2);
\coordinate (C4) at ($(C3)!2cm!90:(C2)$);
\draw (C3) -- (C2);
\draw [red] (C3) -- (C4);
\node at (C1) {C1};
\node at (C2) {C2};
\node at (C3) {C3};
\node at (C4) {C4};
\end{tikzpicture}
\end{document}
答案2
除了 Jake 的回答之外,当想要进行稍微复杂的点加权等操作时,本地shift
和scale
选项很有用(与x
和y
对应项一起)。它们映射到较低级别的 PGF 命令\pgfpointadd
和\pgfpointscale
命令。
\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw[style=help lines] (-1,-1) grid[step=1] (1,1);
\node (c1) at (1,1) {c1};
\node (c2) at (-1,-1) {c2};
\node (c3) at (-1,1) {c3};
\coordinate (c4) at ($([shift={(-1,-1)}]c1)+(c2)+([xscale=-1]c3)$);
\draw[-latex] (c4) -- (1,-1);
\end{tikzpicture}
\end{document}