我想画出一组中间带有箭头的平滑曲线。所以我必须结合decoration
和smooth
选项。但是,这两个选项都会导致dimension too large
错误。
如果我删除smooth
选项,它就会编译。另一方面,不合适的标记位置也会导致同样的错误。
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{calc,decorations.markings}
\begin{document}
\begin{tikzpicture}
\newcommand\arrowcurve[3][]{\addplot[#1,decoration={markings,mark=at position #2 with {\arrow{>}}},postaction={decorate}] coordinates {#3} }
\begin{axis}[hide x axis, hide y axis]
\foreach \i/\j in {1/1,-1/1,-1/-1,1/-1} {
\foreach \t in {20,35,50,60,70,80} {
\arrowcurve[smooth]{0.4}{({cos(\t)*2*\i},{sin(\t)*2*\j}) ({cos(\t*3/4+22.5)*\i},{sin(\t*3/4+22.5)*\j}) (0,0)};
}
}
\end{axis}
\end{tikzpicture}
\end{document}
答案1
当您使用smooth
选项时,每个点都通过贝塞尔曲线与附加控制点相互连接。在开始和结束时,其中一个控制点成为坐标本身,因此两点之间的距离为零。这会导致装饰库根据装饰类型因各种原因而抱怨。
您可以通过钥匙晚开始装修,早完成pre length,post length
。
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.10}
\usetikzlibrary{calc,decorations.markings}
\begin{document}
\begin{tikzpicture}
\newcommand\arrowcurve[3][]{
\addplot[#1,
decoration={
post length=1mm,
pre length=1mm,
markings,
mark=at position #2 with {\arrow{>}}},
postaction={decorate}] coordinates {#3} }
\begin{axis}[hide x axis, hide y axis]
\foreach \i/\j in {1/1,-1/1,-1/-1,1/-1} {
\foreach \t in {20,35,50,60,70,80} {
\arrowcurve[smooth]{0.4}{({cos(\t)*2*\i},{sin(\t)*2*\j}) ({cos(\t*3/4+22.5)*\i},{sin(\t*3/4+22.5)*\j}) (0,0)};
}
}
\end{axis}
\end{tikzpicture}
\end{document}
我认为smooth
这里滥用了选项。你浪费了一个可以精确绘制曲线的好工具。我建议对曲线进行参数化。
答案2
非常不推荐的排版方式
代码中似乎有一个错误。我手动忽略了所有错误(按住 Enter 键),结果看起来不错。我们无法使用,\nonstopmode
因为有超过 100 个错误/点,这将导致没有 PDF 文件。我必须说我的答案很糟糕,我自己也不喜欢它,但它现在有效,直到有人找到更好的方法。
%! *latex mal-decorations.tex
\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\begin{document}
\begin{tikzpicture}
\foreach \i/\j in {1/1,-1/1,-1/-1,1/-1} {
\foreach \t in {20,35,50,60,70,80} {
\draw[
decoration={markings, mark=at position 0.4 with {\arrow{>}}}, % \node{a};
postaction={ decorate },
] plot [smooth] coordinates {
({cos(\t)*2*\i}, {sin(\t)*2*\j})
({cos(\t*3/4+22.5)*\i}, {sin(\t*3/4+22.5)*\j)})
(0,0)
} ;
}
}
\end{tikzpicture}
\end{document}