与矩阵节点边界的交点

与矩阵节点边界的交点

考虑以下代码:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{matrix,intersections,calc}

\begin{document}

\begin{tikzpicture}
   \matrix (m) [matrix of math nodes,row sep={4em,between origins},column sep={5em,between origins},nodes={anchor=base}]{
      |[draw,inner sep=5pt,name path=border1]| \frac{A}{B}& E \\
      C & D \\ };
   \draw[->,name path=line1] (m-1-1.base west) -- (m-2-2.north east);
   \fill [name intersections={of=line1 and border1},green] (intersection-1) circle (1.5pt) (intersection-2) circle (1.5pt);
   \fill [red] ($(m-1-1.base)+(intersection-1)$) circle (1.5pt) ($(m-1-1.base)+(intersection-2)$) circle (1.5pt);
\end{tikzpicture}

\end{document}

结果:

结果图

它的目的是找到(绿色)左上角节点 (m-1-1) 的矩形边框(绘制并命名为“border1”)与图中唯一箭头的交点。但是,如您所见,绿色交点并不位于 (m-1-1) 的边界上。相反,只有绿色点相对于点 (m-1-1.base) 的偏移量(绘制为红色)才位于边界上。

这表明名为“border1”的路径不是放在左上角的节点上,而是放在整个图片的中心某处。更准确地说,节点 (m-1-1) 的实际边界似乎是“border1”移动了 (m-1-1.base)。

因此,有几个与此相关的问题以及如何解决我的问题:

  1. 为什么“border1”是原来的边界,而不是(m-1-1)的实际边界?

  2. 是否可以采取一些不同的方式来获得节点的实际边界(而不是移动到图片中心的边界),然后我们可以用它来计算交点?

  3. 给定路径“border1”(绘制之后),我们如何创建它的一个副本,该副本按(m-1-1.base)移动,然后我们可以使用它来计算交点?(顺便问一下,如果我们不知道节点固定在(m-1-1.base)怎么办?)

答案1

  1. 因为矩阵是非常复杂。我看了一眼代码,试着理解它。我花了好几天才重新理清思路。节点必须在定位之前设置,因为它们的位置取决于后面节点的位置,所以它们要排版,然后放入框中,测量,然后定位,最后渲染框。但定位和标记是在放入框时进行的,所以偏移量都是错误的。如果你尝试矩阵中的其他条目,你会发现它们是全部位于矩阵的中心。

  2. 是的。有两种方法。一种方法是利用矩阵渲染后偏移量被记住的事实。如果你行动迅速,你可以阅读这些并找出偏移量的位置。我在回答关于设置矩阵背景的问题时做了类似的事情:如何在 Tikz 中设置矩阵节点的行和列的背景颜色?。 如果你真的想要这个,可以做到。但更快捷的方法是使用fit库,在正确定位原始节点后在其周围放置一个新节点。因此,以下方法有效:

    \documentclass{article}
    %% \url{https://tex.stackexchange.com/q/15985/86}
    \usepackage{tikz}
    \usetikzlibrary{matrix,intersections,calc,fit}
    
    \begin{document}
    
    \begin{tikzpicture}
       \matrix (m) [matrix of math nodes,row sep={4em,between origins},column sep={5em,between origins},nodes={anchor=base}]{
          |[draw,inner sep=5pt]| \frac{A}{B}& E \\
          C & D \\ };
    \node[fit=(m-1-1),name path=border1,inner sep=0pt] {};
       \draw[->,name path=line1] (m-1-1.base west) -- (m-2-2.north east);
       \fill [name intersections={of=line1 and border1},green] (intersection-1) circle (1.5pt) (intersection-2) circle (1.5pt);
    \fill [red] ($(m-1-1.base)+(intersection-1)$) circle (1.5pt) ($(m-1-1.base)+(intersection-2)$) circle (1.5pt);
    \end{tikzpicture}
    
    \end{document}
    

    矩阵内的交点

  3. 我认为我对(2)的回答也回答了这个问题。

相关内容