如何提取 Tikz 中路径上某个点的方向?

如何提取 Tikz 中路径上某个点的方向?

我按照网上的一些提示来提取路径上的某个点,如下所示

\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 pathuse 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}

在此处输入图片描述

更核心级别的选项是使用\pgfpathcurvebetweentimepgfmanual 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}

在此处输入图片描述

相关内容