是否可以结合 TikZ 距离和线到操作?

是否可以结合 TikZ 距离和线到操作?

使用 LaTeX 和 TikZ,是否可以在同一个命令中使用 Line-To 操作和距离操作?我想绘制一个矩形,然后在矩形上边缘的中点创建一个命名节点。为此,我使用距离操作来查找矩形的中心,然后使用 Line-To 操作来查找上边缘。请参阅下面的 MWE 代码,我认为它应该可以工作,但实际上不起作用。

\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}
\node (A) at (0,0) {};
\node (B) at (10,10) {};
\node [above right] at (A) {A};
\node [below left] at (B) {B};
\draw [draw=black] (B) rectangle (A);
\node at ($(A)!0.5!(B)$ |- B) {Top of Rect [incorrect]};
\node (ABMid) [below] at ($(A)!0.5!(B)$) {Midpoint AB};
\node (rectTop) [above] at (ABMid|-B) {Top of Rect [correct]};
\end{tikzpicture}
\end{document}

答案1

我不会使用这样的数学计算来获得顶线中间的坐标。路径上的节点可以非常智能地放置。

这里的问题是,原始rectangle路径上的节点放置仅在两个坐标之间的直线上,因此以下两条路径上的节点位于相同的位置<pos>

\path (c1) --        node[pos=<pos>] {} (c2);
\path (c1) rectangle node[pos=<pos>] {} (c2);

我会为您提供三个解决方案。

  1. 一个简单的辅助坐标。
  2. rectangle用两个|-/路径替换该路径-|
  3. 使用适当的计时器通过我的rectangle路径函数ext.paths.timertikz-ext包裹

解决方案 1

使用辅助坐标你只需做

\draw (B) rectangle coordinate (aux1) (A) node[above] at (aux1 |- B) {Top of the Rect};

代码

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at (0,0);
\coordinate [label=below left:B] (B) at (20,10);
\draw (B) rectangle coordinate (aux1) (A) node[above] at (aux1 |- B) {Top of the Rect};
\end{tikzpicture}
\end{document}

解决方案 2

使用两个组合的|--|和位置.75.25(分别)。角具有位置.5(→关节 TikZ 路径上的节点)。

代码

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at (0,0);
\coordinate [label=below left:B] (B) at (20,10);
\draw (B) -| node[pos=.25, above] {Top of the Rect} (A) -| (B);
\end{tikzpicture}
\end{document}

解决方案 3

加载ext.paths.timer库然后您可以使用very near startpos = 0.125)访问第一侧(顶部)的中间。

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{ext.paths.timer}
\begin{document}
\begin{tikzpicture}
\coordinate [label=above right:A] (A) at ( 0, 0);
\coordinate [label=below  left:B] (B) at (20,10);
\draw (B) rectangle node[very near start, above] {Top of the Rect} (A);
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

答案2

编辑:在底部看到一个内联计算。

原则上是的。我还没有真正优化以下内容,它可以稍微减少一些。

您可以使用let操作符(它也来自calc库)。

你想要做的是获得最大坐标,然后选择一半X坐标。因此你需要X每个点的坐标。

此外你应该绝不使用 指定坐标node!这可能会带来意想不到的问题。请记住,节点保留大小,而坐标不保留。

我会按照如下方式来设置你的系统:

\begin{tikzpicture}
  \coordinate (A) at (0,0);
  \node[above right] at (A) {A};
  \coordinate (B) at (10,10);
  \node[below left] at (B) {B};
  \draw [draw=black] (A) rectangle (B);
  \draw let \p1 = (A),
          \p2 = (B),
          \n{x} = {(\x1+\x2)/2},
          \n{y} = {max(\y1,\y2)} in
          (\n{x},\n{y}) node[above] {Top of Rect [incorrect]};
  \coordinate (ABMid) at ($(A)!0.5!(B)$);
  \node at (ABMid) {Midpoint AB};
\end{tikzpicture}

当然,如果你不需要坐标,ABMid那么就这样做\node at ($(A)!.5!(B)$) {...};

上面的操作是计算在路上X顶点的坐标。\p<int> = (<coordinate>)将保存X进行\x<int>,\y<int>进一步的计算let。该\n{x}行计算X-顶点的坐标,然后该\n{y}线计算最大值-协调。

上述代码将得出:

在此处输入图片描述

我意识到你确实想要一些内联的东西(这是可行的,但是丑陋的)。因此,您可以做的是B从 开始投射到垂直线上A,然后计算该点和 之间的中点B,这样就可以得到所需线的一半。

因此可以通过以下方式完成朦胧构造:

\coordinate (ABMidTop) at ($(A)!(B)!($(A)+(0,1)$)!.5!(B)$); 
\node[above] at (ABMidTop) {Top of Rect [incorrect]};

应该这样理解:
画一条线AA+(0,1),然后投影B到这条线上。然后取前一个计算点和 之间的中点B

相关内容