这是一个 MWE几乎这样做:
\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{calc,intersections,through,backgrounds,matrix,patterns}
\begin{document}
\begin{tikzpicture}[scale=0.5]
\footnotesize
\draw[<->] (0,15)--(0,0)--(16.5,0);
\draw[name path = S] (0,0) ..controls (1,5) and (9,9.5) .. (12,10.1) node[right]{$S$};
\draw[name path = Y] (0,0)--(12,12) node[right]{$Y$};
\path [name intersections={of=S and Y, by = I1}];
\draw[dashed] let \p1 = (I1) in (\x1,0) node[below]{$k^*$} --(\x1,\y1);
% a loop to generate the arrows on the x-axis
\foreach\i in {1,...,5}{
\draw let \p1 = (I1) in (\x1,0) node[shift={(0.5*\i,0)}] {$<$};
\draw let \p1 = (I1) in (\x1,0) node[shift={(-0.5*\i,0)}] {$>$};
}
\end{tikzpicture}
\end{document}
该 MWE 产生以下输出:
我确实知道为什么会出错。 Y 线和 S 线有两个交点 - 一个在原点,另一个在更高处(我实际上想要处理的那个)。 指定坐标的代码I1
是:
\path [name intersections={of=S and Y, by = I1}];
这将取第一个交点于(0,0)
,这就是为什么输出如您所见。
然而,尽管知道问题所在,却不知道如何解决它。
我该如何修改该代码来获取第二个交点?
有一个“秘诀”可用于解决该问题。只需将 Y 线的初始坐标从 更改为(0,0)
。(0.001, 0)
这将删除第一个交点,而不会产生任何可见效果。但是,我仍然想知道如何稳健地解决它。
答案1
您可以将列表传递给by
键,然后交叉点将根据列表命名。您甚至可以使用键沿着一条路径对交叉点进行排序sort by
,但这可能无法处理复杂的直线集合。
\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{calc,intersections,through,backgrounds,matrix,patterns}
\begin{document}
\begin{tikzpicture}[scale=0.5]
\footnotesize
\draw[<->] (0,15)--(0,0)--(16.5,0);
\draw[name path = S] (0,0) ..controls (1,5) and (9,9.5) .. (12,10.1) node[right]{$S$};
\draw[name path = Y] (0,0)--(12,12) node[right]{$Y$};
\path [name intersections={of=S and Y, by ={aux, I1}}];
\draw[dashed] let \p1 = (I1) in (\x1,0) node[below]{$k^*$} --(\x1,\y1);
% a loop to generate the arrows on the x-axis
\foreach\i in {1,...,5}{
\draw let \p1 = (I1) in (\x1,0) node[shift={(0.5*\i,0)}] {$<$};
\draw let \p1 = (I1) in (\x1,0) node[shift={(-0.5*\i,0)}] {$>$};
}
\end{tikzpicture}
\end{document}