在表达式中使用 TikZ 坐标?

在表达式中使用 TikZ 坐标?

我希望能够\coordinate从两个现有坐标开始计算两个新的 s。我定义了两个坐标c1c2。一个最小的例子是

\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中间。我试过了c1c2

\coordinate (c3) at (0.5*c1+0.5*c2);

但这给了我错误

Package pgf Error: No shape named 0 is known

其次,我想从 画一个箭头,与和c3之间的线正交。所以我想取差值,将该向量旋转一定角度,对其进行归一化,将其乘以箭头应有的长度,然后将其添加到并将其存储为名为 的新坐标。这可能吗?(我想避免手动计算坐标,因为我必须多次执行此操作,并且我希望能够轻松地对其进行更改)c1c2c2-c190c3c4

编辑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(我假设它会自动使用xy向量,就像所有其他没有单位的坐标一样)显然不起作用。有没有关于如何用“单位长度”来指定箭头长度的想法?((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 的回答之外,当想要进行稍微复杂的点加权等操作时,本地shiftscale选项很有用(与xy对应项一起)。它们映射到较低级别的 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}

在此处输入图片描述

相关内容