如何使用 TikZ 水平绘制一条通过点 A 直到到达节点 B 边界的线?

如何使用 TikZ 水平绘制一条通过点 A 直到到达节点 B 边界的线?

给定点 A 和一个椭圆形状的节点 B,如何从 A 水平画一条线直到到达 B 的边界?

蒂克兹

答案1

一种方法是使用交集库:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections}

\begin{document}

 \begin{tikzpicture}
    \coordinate[label=left:$A$] (A) at (0,0);
    \coordinate[label=center:$B$] (B) at (2,1);

    \draw[name path=B node] (B) ellipse (0.5 and 1.2);
    \path [name path=A--B] (A) -| (B);
    \path [name intersections={of=A--B and B node}];
    \fill (A) circle (2pt);
    \draw (A)  -- (intersection-1);
 \end{tikzpicture}

\end{document}

答案2

如果您有intersections可用的库,我同意这是最好的方法。但在引入之前的 TikZ 版本intersections(显然在野外相当常见)没有自动计算直线和椭圆节点之间交点的能力。如果它是一个圆形节点,你可以这样做

\begin{tikzpicture}
 \node (A) at (0,0) {A};
 \node[draw,circle,minimum height=3cm] (B) at (2,1) {B};
 \draw (A) -- (intersection cs: first line={(A)--+(10,0)},second node=B,solution=2);
\end{tikzpicture}

但这种方法对省略号不起作用。因此,这里有一些替代方案。

一个选项是通过在节点前绘制线来“作弊”,然后用不透明的颜色填充节点:

\begin{tikzpicture}
 \node (A) at (0,0) {A};
 \node[ellipse,minimum height=3cm] (B) at (2,1) {};
 \draw (A) -- (intersection cs: first line={(A)--+(10,0)},second line={(B.center)--(B.south)});
 \node[fill=white,draw,ellipse,minimum height=3cm] at (B) {B};
\end{tikzpicture}

但这是极不可取的,因为它要求您指定同一个节点两次。

一个稍微好一点(但仍然不理想)的选择是使用 TikZ 手动计算线结束的正确位置。

\begin{tikzpicture}
 \node (A) at (0,0) {A};
 \node[draw,ellipse,minimum height=3cm] (B) at (2,1) {B};
 \newdimen\semimajor
 \newdimen\semiminor
 \newdimen\ydiff
 \pgfextracty{\semimajor}{\pgfpointdiff{\pgfpointanchor{B}{south}}{\pgfpointanchor{B}{center}}}
 \pgfextractx{\semiminor}{\pgfpointdiff{\pgfpointanchor{B}{west}}{\pgfpointanchor{B}{center}}}
 \pgfextracty{\ydiff}{\pgfpointdiff{\pgfpointanchor{A}{center}}{\pgfpointanchor{B}{center}}}
 \pgfmathparse{\semiminor * sqrt(1 - pow(\ydiff / \semimajor,2))};
 \draw (B.center) ++(-\pgfmathresult pt,-\ydiff) -- (A);
\end{tikzpicture}

答案3

虽然有点晚了,但我还是偶然发现了这一点,而且交叉点机制有点过头了。您可以直接指定希望线路到达的锚点,如下所示:

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}

\begin{document}

 \begin{tikzpicture}
    \node [label=south:$A$] (A) at (0,0) {};
    \filldraw (A) circle (1pt) ;
    \node [draw, ellipse, minimum height = 2cm] (B) at (2,0) {B};

    \draw [red] (A.center) -- (B.east) ;
 \end{tikzpicture}

\end{document}

这将产生以下图像:

从 A 到 B 另一侧的线。

如果希望线条移到左侧,请将其替换(B.east)(B.west)。如果希望线条移到其他地方,可以使用锚点,其中(B.θ)θ是0到360之间的整数;0对应于east,加一会将锚点沿节点边界移动一度。

答案4

基于Martin Heller 的评论,我们得到了原问题的一个实际解,即一个点(即一个小圆;任何节点都可以,包括坐标)和一个椭圆节点之间的一条水平线段:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections,calc,shapes.geometric}
\begin{document}
\begin{tikzpicture}
  \node (B) [draw,shape=ellipse,minimum height=11ex,name path=B] {B};
  \node[circle,inner sep=.2ex,outer sep=0pt,fill] (A) at ($(B.west)-(2em,3ex)$) {};
  \node[anchor=east,inner sep=0pt,outer sep=0pt] at (A.west) {A};
  \path[name path=L] (A) -- (A-|B);
  \path[name intersections={of=B and L, by=int}];
  \draw[-] (A) -- (int);
\end{tikzpicture}
\end{document}

输出

相关内容