如何获取tikz/PGF坐标的一个组件?

26
我正在尝试在我的图表中画一条水平线。该线的Y坐标应该位于点a和点b之间的正中间(其中a在b下面)。该线的左端点和右端点位于tikzpicture的边界框上。以下是我目前使用交叉运算符进行操作的方式:
\coordinate (h0) at ($(a.north)!0.5!(b.south)$);
\draw (h0 -| current bounding box.west) -- (h0 -| current bounding box.east);
这种方法似乎有些绕弯子。我更想做的是获取(h0)的Y坐标以及边界框的东、西两侧的X坐标,并自行组合这些坐标。我很想这样做,但它不支持此语法:
\coordinate (h0) at ($(a.north)!0.5!(b.south)$);
\draw (current bounding box.west.x,h0.y) -- (current bounding box.east.x,h0.y);
我是否缺少引用坐标的独立组件的方法?
3个回答

26

你可以访问 let 操作内部的组件。详细内容请参考PGF手册,但从记忆中来说:

\draw
  let
    \p1=($(a.north)!0.5!(b.south)$),
    \p2=(current bounding box.west),
    \p3=(current bounding box.east)
  in
    (\x2,\y1) -- (\x3, \y1);

那可能需要调试... 编辑:现在已经被问问题的人解决了。


1
调试:需要删除\p3行末尾的逗号,a.north需要一个闭合的括号,b.south需要一个开放的括号。完成后,这个程序可以完美运行。谢谢! - uckelman

11

或者,使用

\pgfextractx{<dimension>}{<point>}
\pgfextracty{<dimension>}{<point>}

这些是原始的PGF命令,因此使用它们可能不太方便。


5
但是<point>确实需要成为低级的pgfpoint。为了使它能够与使用\coordinate at ...定义的点一起工作,您需要使用\pgfpointanchor{coordinate}{center}来指定锚点,因为\coordinate(coordinate)at(1,2);定义了一个形状为coordinate的节点(具有一个名为center的锚点),而\pgfpointanchor返回此锚点的pgf低级点。 - leemes
@leemes 你有没有想过如何让\pgfpointanchor适用于pgfpoints(即如果坐标实际上是pgfpoint,则只返回该点)?或者区分pgfpoints和坐标?我问这个问题是因为在路径中,\tikztotarget可以是一个点或一个坐标,这取决于起点是 A 还是 A.east - tobiasBora

5

我刚才从这里找到了另一种选项,它展示了你可以通过以下方式从一个节点获取相对位置:

\node at (2, 1) (a) {};
\draw (a) -- ++(right:2);

这将从节点a绘制一条线到点a向右2个单位的点。就像我链接的例子一样,当您不知道节点的确切坐标并且需要相对于它绘制事物时,这非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接