生成离散正弦波,其中的点相对于曲线的弧长等距分布

生成离散正弦波,其中的点相对于曲线的弧长等距分布

我正在尝试使用 tikz 离散化正弦波(如 A(x)sin(bx)),以使连接离散点的线段具有均匀的长度。有没有简单的方法可以做到这一点?我能想到的唯一解决方案是使用 Matlab 找出适当的点,然后将值繁琐地复制并粘贴到我的 tex 编辑器中(参见下面的代码)。

\begin{figure}[h!]
\label{fig:midline_discretization}
\begin{center}
\begin{tikzpicture}(120, 50)
    \put(10.0000,25.0000){\circle*{2}}
    \put(20.9912,26.6953){\circle*{2}}
    \put(31.9241,24.9382){\circle*{2}}
    \put(42.0139,20.2444){\circle*{2}}
    \put(52.1888,15.7636){\circle*{2}}
    \put(63.1267,16.0286){\circle*{2}}
    \put(72.3473,22.1508){\circle*{2}}
    \put(80.0280,30.2114){\circle*{2}}
    \put(87.6501,38.3286){\circle*{2}}
    \put(97.0000,44.1400){\circle*{2}}  
    \draw (10.0000,25.0000) -- (20.9912,26.6953) -- (31.9241,24.9382) -- (42.0139,20.2444) -- (52.1888,15.7636) -- (63.1267,16.0286) -- (72.3473,22.1508) -- (80.0280,30.2114) -- (87.6501,38.3286) -- (97.0000,44.1400) ;
    \put(2.5000,29.0000){$\mathbf X_{(0,m_2,m_3)}$}
    \put(14.9912,32.6953){$\mathbf X_{(1,m_2,m_3)}$}
    \put(28.9241,27.0382){$\mathbf X_{(2,m_2,m_3)}$}
    \put(92.0000,47.6400){$\mathbf X_{(N-1,m_2,m_3)}$}
\end{tikzpicture}
\end{center}
\end{figure}

答案1

您所要求的其实非常不简单:给定某个点 $x$,下一个点 $x'$ 必须满足 $(A(x')sin(x') - A(x)sin(x))^2 + (x'-x)^2 = d^2$。有比 Tikz 更好的程序可以解决这样的方程。

但是,如果您使用 pgfplots (基于 tikz),您可以将部分工作转移到 TeX(或类似),例如:

\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=1.11}

\begin{filecontents*}{points.data}
   x        y
10.0000  25.0000
20.9912  26.6953

31.9241  24.9382
42.0139  20.2444

52.1888  15.7636
63.1267  16.0286

72.3473  22.1508
80.0280  30.2114

87.6501  38.3286
97.0000  44.1400
\end{filecontents*}

\begin{document}    
\begin{center}
\begin{tikzpicture}
  \begin{axis}[nodes near coords={$\mathbf{X}_{(\coordindex,m_{2},m_{3})}$},
    width=\textwidth]
    \addplot[mark=*] table {points.data};
  \end{axis}
\end{tikzpicture}

\end{center}
\end{document}

这里的技巧是,每当您想要中断行时,就在数据文件中插入一个空行。

您还可以在文件中指定标签 (在 pgfplots 中使用文本数据作为标记标签),它可用于抑制某些标签(显然,当某一行缺少标签时,最后一个标签会重复,因此第四行数据中会出现 {}):

\begin{filecontents*}{points.data}
   x        y      label
10.0000  25.0000  \mathbf{X}_{(0,m_{2},m_{3})}
20.9912  26.6953  \mathbf{X}_{(1,m_{2},m_{3})}

31.9241  24.9382  \mathbf{X}_{(2,m_{2},m_{3})}
42.0139  20.2444  {}

52.1888  15.7636  
63.1267  16.0286  

72.3473  22.1508  
80.0280  30.2114  

87.6501  38.3286  
97.0000  44.1400  \mathbf{X}_{(N-1,m_{2},m_{3})}
\end{filecontents*}

\begin{tikzpicture}
  \begin{axis}[nodes near coords={$\pgfplotspointmeta$},
    point meta=explicit symbolic,
    width=\textwidth]
    \addplot[mark=*] table [meta index=2] {points.data};
  \end{axis}
\end{tikzpicture}

最后,您还可以告诉 pgfplots 为您计算函数,因此只需提供 x 值即可:

\begin{filecontents*}{points.data}
   x
10.0000
20.9912

31.9241
42.0139

52.1888
63.1267

72.3473
80.0280

87.6501
97.0000
\end{filecontents*}

\tikzset{declare function={f(\x)=\x^3*sin(4.5*\x)/10^5+4;}}

\begin{tikzpicture}
  \begin{axis}[nodes near coords={$\mathbf{X}_{(\coordindex,m_{2},m_{3})}$},
    width=\textwidth]
    \addplot[mark=*] table [y expr=f(\thisrowno{0})] {points.data};
  \end{axis}
\end{tikzpicture}

所有三个代码的图片: 所有三个代码的图片

答案2

另一种带有标记装饰并使用序列号的结构更加易于操作。

\documentclass[tikz]{standalone}
\usetikzlibrary{decorations.markings}
\begin{document}
\begin{tikzpicture}[dashed sine/.style={postaction={decorate},
  decoration={markings,mark=between positions 0 and 1 step {pi/6}*1cm with {%
    \edef\temp{\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}}%
    \coordinate (mark-\temp);%
    \ifodd\temp\relax\else\draw (mark-\temp) -- (mark-\number\numexpr\temp-1\relax);\fi%
  }}}]
\draw[very thin,color=gray] (-0.1,-1.1) grid (5.9,1.9);
\path[draw=blue,dashed sine] plot[samples=151,domain=0:4] (\x,{sin(3*\x r)});
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

像这样?

\documentclass[border=1]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\begin{tikzpicture}
    \begin{axis}
      \addplot[dash pattern=on 10pt off 10pt,samples=200,blue,thick]   {sin(deg(x))};
     \end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

按照你喜欢的方式改变dash pattern=on 10pt off 10pt

相关内容