我按照网上的一些提示来提取路径上的某个点,如下所示
\documentclass{article}
\usepackage{tikz,color}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\begin{document}
\begin{tikzpicture}
\draw (0,2) to[out=-90,in=0] coordinate[pos=0.28](A)(-3,-1);
\draw [red] (0,2) to[out=-90] (A);
\fill[blue] (A) circle (2pt);
\end{tikzpicture}
\end{document}
其中 A 是兴趣点。我想绘制另一条精确位于给定曲线顶部的路径,但只用红色覆盖从 (0,2) 到 A 的路径。为此,我需要知道点 A 的“入”方向。我以前使用过 asymptote,它有一个 dir 命令来提取某个点的路径方向,但我在 tikz 中没有看到它。
ps 有人建议我重新绘制从 (0,2) 到 A 以及从 A 到 (-3,1) 的路径,这样我就可以控制 A 处的方向。就我的情况而言,我想知道一种更通用的方法来提取方向,这样我就可以为其他复杂情况进行编程。谢谢。
答案1
pgfplots 库fillbetween
有访问交叉点段的选项。但是,在这里您可以只剪切路径的相关部分。为了更方便,可以使用save path
和use path
来重复使用路径。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\begin{document}
\begin{tikzpicture}
\draw[save path=\pathA] (0,2) coordinate (start) to[out=-90,in=0] coordinate[pos=0.28](A)(-3,-1);
\draw [red] (0,2) to[out=-90] (A);
\begin{scope}
\clip[overlay] let \p1=($(A)-(start)$),\n1={veclen(\x1,\y1)} in
(start) circle[radius=\n1];
\draw[orange,thick,use path=\pathA];
\end{scope}
\fill[blue] (A) circle[radius=2pt];
\end{tikzpicture}
\end{document}
或者,您可以放置A
并decorations.markings
从变换矩阵中读出旋转角度。(请注意,如果您以不同的方式缩放 x 和 y,事情会变得更加复杂。还要注意,这通常不会恢复精确的子路径,因为曲线不是由入角和出角完全固定的,还有一个松散参数。)
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\begin{document}
\begin{tikzpicture}
\path (0,0) coordinate (O) (1,0) coordinate (X);
\draw[postaction=decorate,decoration={markings,
mark=at position 0.28 with {\coordinate(A);
\pgfgettransformentries\tmpA\tmpB\tmpC\tmp\tmp\tmp
\pgfmathsetmacro{\myrot}{atan2(\tmpB,\tmpA)+180}%
\xdef\myrot{\myrot}%
}}]
(0,2) coordinate (start) to[out=-90,in=0] (-3,-1);
\draw [red] (0,2) to[out=-90] (A);
\draw[orange,thick] (start) to[out=-90,in=\myrot] (A)
node[right]{in angle is $\myrot^\circ$};
\fill[blue] (A) circle[radius=2pt];
\end{tikzpicture}
\end{document}
更核心级别的选项是使用\pgfpathcurvebetweentime
pgfmanual v3.1.5 第 1095 页。这是一个非常基本的选项,它使用show path construction
装饰来获取曲线的起点、终点和控制点。这可以做得更 Ti钾当然是 Zy,但这是基本的东西。样式subcurve
采用三个参数:一组 pgf 指令,指示如何处理路径、开始时间和结束时间。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\tikzset{subcurve/.style n args=3{decoration={show path construction,
moveto code={},
lineto code={},
curveto code={
\typeout{\tikzinputsegmentfirst}
\path (\tikzinputsegmentfirst) coordinate (tikzinputsegmentfirst)
(\tikzinputsegmentsupporta) coordinate (tikzinputsegmentsupporta)
(\tikzinputsegmentsupportb) coordinate (tikzinputsegmentsupportb)
(\tikzinputsegmentlast) coordinate (tikzinputsegmentlast);
\pgfpathcurvebetweentime{#2}{#3}{\pgfpointanchor{tikzinputsegmentfirst}{center}}%
{\pgfpointanchor{tikzinputsegmentsupporta}{center}}%
{\pgfpointanchor{tikzinputsegmentsupportb}{center}}%
{\pgfpointanchor{tikzinputsegmentlast}{center}}%
#1
\pgfusepath{stroke}
},
closepath code={}
},decorate}}
\begin{document}
\begin{tikzpicture}
\path (0,0) coordinate (O) (1,0) coordinate (X);
\draw[postaction={subcurve={\pgfsetstrokecolor{red}\pgfsetlinewidth{1pt}}{0}{0.28}}]
(0,2) coordinate (start) to[out=-90,in=0]
coordinate[pos=0.28](A)(-3,-1);
%\draw [red] (0,2) to[out=-90] (A);
\fill[blue] (A) circle[radius=2pt];
\end{tikzpicture}
\end{document}