如何获取2条任意曲线的交点?

如何获取2条任意曲线的交点?

这个问题导致了一个新的方案的出现:
pst-intersect

根据我的经验,PSTricks 中没有宏可以获取两条曲线的交点。在 PSTricks 中可以做到这一点吗?或者我在做一件不可能的事情?

\documentclass[pstricks,border=12pt]{standalone}

\begin{document}
\begin{pspicture}[showgrid](4,3)
    \pscurve[linecolor=red](0,3)(1,1)(2,3)(3,2)(4,0)
    \pscurve[linecolor=blue](0,0)(1,3)(2,1)(3,1)(4,3)
\end{pspicture}
\end{document}

在此处输入图片描述

答案1

我刚刚发布了一个新的 PSTricks 包pst-intersect,可以计算几乎任意路径的交点。

关于曲线,您可以按如下方式计算交点:

\documentclass{article}
\usepackage{multido, pst-intersect}
\thispagestyle{empty}
\begin{document}
\begin{pspicture}[showgrid](4,3)
  \pssavepath[linecolor=red]{A}{\pscurve(0,3)(1,1)(2,3)(3,2)(4,0)}
  \pssavepath[linecolor=blue]{B}{\pscurve(0,0)(1,3)(2,1)(3,1)(4,3)}
  \psintersect[showpoints, name=C]{A}{B}
  \pstracecurve[linewidth=2\pslinewidth, istart=2, istop=3]{C}{A}
  \multido{\i=1+1}{3}{\uput[0](C\i){\i}}
\end{pspicture}
\end{document}

结果

在此处输入图片描述

这还显示了一些其他包功能:使用交叉节点,并重新追踪已保存路径的部分。

为了获取交叉点的坐标,您可以使用pst-nodes的参数saveNodeCoors或包宏(这两个选项自 0.3 版起可用)。然后可以使用包的\psGetIsectCenter显示值:\psPrintValuepst-tools

\documentclass{article}
\usepackage{multido, pst-intersect, pst-tools}
\thispagestyle{empty}
\begin{document}
\begin{pspicture}[showgrid](4,3)
  \pssavepath[linecolor=red]{A}{\pscurve(0,3)(1,1)(2,3)(3,2)(4,0)}
  \pssavepath[linecolor=blue]{B}{\pscurve(0,0)(1,3)(2,1)(3,1)(4,3)}
  \psintersect[showpoints, name=C, saveNodeCoors]{A}{B}
  \pstracecurve[linewidth=2\pslinewidth, istart=2, istop=3]{C}{A}
  \multido{\i=1+1}{3}{\uput[0](C\i){\i}}
\end{pspicture}

\bigskip

\makebox[4em]{X} \makebox[4em]{Y}\\
\multido{\i=1+1}{3}{%
  \makebox[4em]{\psPrintValue{N-C\i.x}}
  \makebox[4em]{\psPrintValue{N-C\i.y}}\\
}%

\makebox[4em]{X} \makebox[4em]{Y}\\
\multido{\i=1+1}{3}{%
  \makebox[4em]{\psPrintValue{\psGetIsectCenter{C}{}{\i} I-C\i.x}}
  \makebox[4em]{\psPrintValue{\psGetIsectCenter{C}{}{\i} I-C\i.y}}\\
}%
\end{document}

在此处输入图片描述

答案2

以下是使用 TikZ 库实现此操作的方法intersections

在此处输入图片描述

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections}

\begin{document}
\begin{tikzpicture}
    \draw [red, smooth, name path=first] plot coordinates {(0,3)(1,1)(2,3)(3,2)(4,0)};
    \draw [blue, smooth, name path=second] plot coordinates {(0,0)(1,3)(2,1)(3,1)(4,3)};
    \draw [thick, name intersections={of=first and second, total=\n}]
        \foreach \i in {1,...,\n}{
            (intersection-\i) circle [radius=3pt]
        };
\end{tikzpicture}
\end{document}

相关内容