给定点 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}
这将产生以下图像:
如果希望线条移到左侧,请将其替换(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}