绘制所有现有交叉点

绘制所有现有交叉点

我有一组与圆相交的箭头,我想动态突出显示所有交叉点。我知道我可以通过 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}

在此处输入图片描述

相关内容