我如何计算线的交叉点的数量?

我如何计算线的交叉点的数量?

这是我的相交线的 TikZ-Code。

\documentclass[tikz]{standalone}

\begin{document}
\begin{tikzpicture}[scale=0.01]
\foreach \line in {-10,-57,-104}
{
    \draw (0,\line) -- ++(438.5,0);
}

\foreach \line in {-160,-241}
{
    \draw (325.5,\line) -- ++(113,0);
}

\foreach \line in {5,50,100,...,300}
{
    \draw[red] (\line,0) -- ++(0,-114);
}       

\foreach \line in {330.5,350,400,433.5}
{
    \draw[red] (\line,0) -- ++(0,-251);
}
\end{tikzpicture}
\end{document}

有没有办法自动计算交叉路口的数量(在本例中为 41 个)?

答案1

在这个简单的例子中,我们可以创建一条全是红线的路径和一条全是黑线的路径,然后让intersections库可以找到这两条线之间的所有交点。

代码

\documentclass[tikz, convert]{standalone}
\usetikzlibrary{intersections}
\tikzset{mark options=gray, mark size=+1.5pt, mark=x}
\begin{document}
\begin{tikzpicture}[x=+.1mm, y=+.1mm]
\draw[name path=blacks]
  foreach \line in {-10, -57, -104}{
    (0, \line) -- +(right:438.5)
  }
  foreach \line in {-160, -241}{
    (325.5, \line) -- +(right:113)
  };
\draw[name path=reds, red]
  foreach \line in {5, 50, 100, ..., 300}{
    (\line, 0) -- +(down:114)
  }
  foreach \line in {330.5, 350, 400, 433.5}{
    (\line, 0) -- +(down:251)
  };
\path[name intersections={of=blacks and reds, name=i, total=\t}]
  plot[samples at={1, ..., \t}] (i-\x)
  node[above right, align=left] at(current bounding box.south west)
  {I've found\\\textcolor{gray}{\t} intersections.};
%%% now \t is lost, either \global it outside the path or
\tikzset{name intersections={of=blacks and reds, total=\T}}
\typeout{I've found \T\space intersections. \t won't work.}
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

日志

我找到了 41 个交叉点。\t 不起作用。

答案2

抱歉,我不懂 tikz,但这里有一个在 MetaPost/MetaFun 中实现的方法。我猜想在 tikz 中也可以实现类似的功能。我们的做法是:

  • 使用一些循环来定义两条(由于 而断开的&&)路径pq,一条用于水平线,一条用于垂直线。
  • 创建与的交点p firstintersectionpath q。这将给出一条由所有交点组成的新路径。
  • 将此新路径的长度加一以获得点的数量。
\startMPpage[offset=1DK]
path p, q, r ;

numeric s ; s := 0.5 ;

p :=
  for i = -10,-57,-104 :
    (0,i) -- (438.5,i) &&
  endfor
  for i = -160, -241 :
    (325.5,i) -- (325.5+113,i) &&
  endfor
  nocycle ;

q :=
  (5,0) -- (5,-114) &&
  for i = 50 step 50 until 300 :
    (i,0) -- (i,-114) &&
  endfor
  for i = 330.5,350,400,433.5 :
    (i,0) -- (i,-251) &&
  endfor
  nocycle ;

p := p scaled s ;
q := q scaled s ;
r := p firstintersectionpath q ;

draw p withcolor darkblue ;
draw q withcolor darkred ;
drawpoints r ;

label.urt("Number of intersections: " & decimal (length r + 1), llcorner currentpicture) ;
\stopMPpage

结果

相关内容