我有一组与圆相交的箭头,我想动态突出显示所有交叉点。我知道我可以通过 tikz' 找到这些交叉点,name intersections
但我无法让它工作。
这是我目前得到的:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,intersections}
\begin{document}
\begin{tikzpicture}
\node[shape=circle,draw] (eye) {};
\draw[name path=circle1] (5,0) circle (1);
\foreach \i in {-5, ..., 5} {
\node[draw, inner sep=0, minimum height=0.25cm,minimum width=0.05cm] at (4,0.25 * \i) (pixel-\i) {};
\draw[name path={ray-\i}, -latex,shorten >=-5cm] (eye) -- (pixel-\i);
\fill[name intersections={of={ray-\i} and circle1,name=int,total=\t}]
\foreach \s in {1,...,\t} (int-\s) coordinate [mark coordinate=red];
}
\end{tikzpicture}
\end{document}
当我尝试运行这个时,我得到了错误
包 pgf 错误:没有已知名为 int-1 的形状。
一个问题是箭头可能没有任何交点,但我不知道\foreach
在这种情况下该怎么做。
答案1
显然 Tikz 不喜欢你人为地延长线条,shorten >=-5cm
所以这就是问题所在。你的线条实际上并没有到达圆,所以没有交点。
可以通过放置节点来解决在后面圆圈或独立于节点绘制线条。
这是代码的略微不同版本(无论如何也不会生成图像)。我为节点命名,pixel-\xi
因为这个是从 1 开始的计数器,因此节点有更合适的名称,例如,pixel-1
而使用\i
,您将得到类似pixel--5
然后 的内容pixel-5
。
输出
代码
\documentclass[margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}
\node[circle,draw] (eye) at (0,0) {};
\draw[name path=circle1] (5,0) circle (1cm);
\foreach \i [count=\xi, evaluate=\xi as \angle using int(12-(\xi*2))] in {-5,...,5}{%
\node[draw, inner sep=0pt, minimum height=.1cm,minimum width=.05cm] at (3.5,\i*.1) (pixel-\xi) {};
\draw[-latex,name path={ray\xi}] (eye) -- (\angle:7cm);
\fill[red,name intersections={of={ray\xi} and circle1, name=i, total=\t}]
\foreach \s in {1,...,\t}{(i-\s) circle (1pt)};
}
\end{tikzpicture}
\end{document}
答案2
您还可以使用 calc 库来扩展行。请注意,当\t=0
仍将\foreach
执行时\s=1
,因此\ifnum ... \fi
进行测试。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,intersections,calc}
\begin{document}
\begin{tikzpicture}
\node[shape=circle,draw] (eye) {};
\draw[name path=circle1] (5,0) circle (1);
\foreach \i in {-5, ..., 5} {
\node[draw, inner sep=0, minimum height=0.1cm,minimum width=0.05cm] at (4,0.2 * \i) (pixel\i) {};
\draw[name path={ray\i}, -latex] (eye) -- ($(eye)!2!(pixel\i)$);
\fill[red,name intersections={of={ray\i} and circle1,name=int,total=\t}]
\ifnum \t>0 \foreach \s in {1,...,\t} {(int-\s) circle (1pt)}
\fi;
}
\end{tikzpicture}
\end{document}
答案3
正如 Alenanno 所解释的那样,TiKZ
不喜欢使用负向延伸路径来计算交点。可以做的是使用calc
库绘制所有具有精确角度的射线。并且由于它们都与右侧圆相交,因此缺少交点的问题就消失了:
\documentclass{standalone}
\usepackage{tikz}
\usepackage{ifthen}
\usetikzlibrary{shapes,intersections,calc}
\begin{document}
\begin{tikzpicture}
\node[shape=circle,draw] (eye) {};
\draw[name path=circle1] (5,0) circle (1);
\foreach \i in {-5, ..., 5} {
\node[draw, inner sep=0, minimum height=0.1cm, minimum width=0.05cm]
at (4,0.1 * \i) (pixel-\i) {};
\draw[name path={ray-\i}, -latex]
let
\p1=($(pixel-\i)-(eye)$), \n1={atan2(\y1,\x1)}
in
(eye)--++(\n1:6.5cm);
\fill[red, name intersections={of={ray-\i} and circle1, name=int, total=\t}]
\foreach \s in {1,...,\t} {(int-\s) circle(1pt)};
}
\end{tikzpicture}
\end{document}