这是我的相交线的 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 中也可以实现类似的功能。我们的做法是:
- 使用一些循环来定义两条(由于 而断开的
&&
)路径p
和q
,一条用于水平线,一条用于垂直线。 - 创建与的交点
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