我有以下坐标计算
\coordinate (a0) at ($(c1)!0.5!(c2)$);
\coordinate (a1) at ($(c3 -| a0) + (1,3)$);
\draw (a1) rectangle (b1);
我想消除第一个坐标并改用此代码
\coordinate (a1) at ($(c3 -| ($(c1)!0.5!(c2)$)) + (1,3)$);
\draw (a1) rectangle (b1);
但它不起作用,即使我在坐标周围加上花括号($(c1)!0.5!(c2)$)
。这里有什么问题?
答案1
线路
\coordinate (a1) at ($(c3 -| ($(c1)!0.5!(c2)$)) + (1,3)$);
给出以下错误信息:
Package pgf Error: No shape named `($(c1' is known.
这可以说明发生了什么。请注意以下两件事:
PGF/TikZ 查找的名称以 开头,(
并在第一个 之前结束)
。
事实上,让我们去掉一层,然后尝试
\coordinate (a1) at (c3 -| ($(c1)!0.5!(c2)$));
这给出了相同的错误消息。
这里有两点错误,第一点很简单。当你在perpendicular
通过另外两点的线,你不是将它们括在(
和中)
。你也没有用 来做这件事c3
!
让我们删除一组括号:
\coordinate (a1) at (c3 -| $(c1)!0.5!(c2)$);
仍然不起作用:
! Package tikz Error: + or - expected.
l.9 \coordinate (a1) at (c3 -| $(c1)
!0.5!(c2)$);
该消息本身并不是很有帮助,但下一行向我们展示了 TikZ 出错的地方。
当 TikZ 遇到 时,(
它会(实际上除了($
)抓取直到下一个的所有内容)
,并假设 是坐标。在这里,它将c3 -| $(c1
作为坐标,所有内容都会崩溃。与数学函数,)
需要向贪婪解析器隐藏:
\coordinate (a1) at (c3 -| {$(c1)!0.5!(c2)$});
事实上这就是全部了,现在可以将其作为坐标和的一个坐标:
\coordinate (a1) at ($(c3 -| {$(c1)!0.5!(c2)$}) + (1,3)$);
当解析器找到时,($
它会将坐标解析交给calc
库,该库会找到另一个(
并将数字的解析交还给 TikZ(它将贪婪地抓取、找到c3
并将$(c1)!0.5!(c2)$
后者交还给的位置,calc
因为$
。
代码
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\coordinate (b1) at (rnd, rnd)
coordinate (c1) at (rnd, rnd)
coordinate (c2) at (rnd, rnd)
coordinate (c3) at (rnd, rnd);
\coordinate (a1) at ($(c3 -| {$(c1)!0.5!(c2)$}) + (1,3)$);
% alternatives:
% \coordinate (a1) at ([shift={(1,3)}] c3 -| {$(c1)!0.5!(c2)$});
% \coordinate (a1) at ([shift={(1,3)}] perpendicular cs:
% horizontal line through = {(c3)},
% vertical line through = {($(c1)!0.5!(c2)$)});
\draw (a1) rectangle (b1);
\end{tikzpicture}
\end{document}