我正在尝试使用 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
。