我想创建一个贝塞尔曲线形式的路径,并沿着路径均匀放置图片图形。在这个例子中,图片仅放置在曲线的最后两个点之间,并且分布不均匀,每个图片之间的间距也不相同。该怎么办?
\begin{tikzpicture}[cc/.pic={\draw[fill=cyan!10]circle[radius=10pt];}]
\draw[help lines](0,0)grid(16,6);
\draw(1,1)..controls(1,5)and(5,5)..(6,3)..controls(7,1)and(15,2)..(14,5)
foreach \t in {0,0.125,...,1}{
pic[pos=\t]{cc}
};
答案1
将坐标、节点和图片放置在直线或曲线上的 TikZ 算法明确地或者隐含地根据“计时器”并根据每个路径段进行操作,这意味着
\path (a) -- pic {cc} (b) -- pic {cc} (c);
(a)
在和(b)
中间放置一张图片。对于直线(b)
,(c)
时间对应于起点和终点之间的分数距离,对于曲线,这是吨多变的。
markings
为了将元素均匀地分布在路径(或子路径)的距离上,decoration.markings
图书馆必须使用(除非你想自己做数学计算)。
它提供了语法mark = at position pos with code
位置可以是无单位分数或距离,也可以是语法。mark = between positions start pos and end pos step stepping with code
以下代码中均使用了这两种方法。由于 TeX 算法不是很精确,因此1
需要手动调整位置,以便实际放置(步进 0.1249 或位置 0.999)。
我使用椭圆来显示标记沿路径旋转。
为了应用两种不同的标记,建议移动内部的装饰设置postaction
。
代码
\documentclass[tikz]{standalone}
%\documentclass{article}
%\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\begin{document}
\begin{tikzpicture}[cc/.pic={\draw[fill=cyan!10]circle[radius=10pt];}]
\draw[help lines] (0,0) grid (16,6);
\draw (1,1) .. controls (1,5) and ( 5,5) .. ( 6,3)
.. controls (7,1) and (15,2) .. (14,5)
[
postaction=decorate,
decoration={
name=markings,
mark={
between positions 0 and 1 step .1249 with
% \pic {cc};
\draw[fill=cyan!10] circle[y radius=5pt, x radius=10pt];
}
}
]
;
\end{tikzpicture}
\begin{tikzpicture}[
CC/.style={
decoration={
name=markings,
mark={
at position #1 with
\draw[fill=cyan!10] circle[y radius=5pt, x radius=10pt];
}
}
}]
\draw[help lines] (0,0) grid (16,6);
\draw (1,1) .. controls (1,5) and ( 5,5) .. ( 6,3)
.. controls (7,1) and (15,2) .. (14,5)
[
postaction=decorate,
CC/.list={0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, .999}
]
;
\end{tikzpicture}
\begin{tikzpicture}[
CC/.style 2 args={
decorate, % moved inside here
/utils/temp/.style={
decoration={
name=markings,
mark={at position ##1 with \draw[fill=#1]circle[radius=10pt];}}},
/utils/temp/.list={#2}},
CP/.style={CC={pink!25}{#1}},
CB/.style={CC={blue!25}{#1}},
]
\draw[help lines](0,0)grid(16,6);
\draw[% decoration styles moved inside the postaction
postaction={CP={0, 0.1, 0.4, 0.5, 0.7, 0.9, 0.999}},
postaction={CB={0.2, 0.3, 0.6, 0.8}}
] (1,1) .. controls (1,5) and ( 5,5) .. ( 6,3)
.. controls (7,1) and (15,2) .. (14,5);
\end{tikzpicture}
\end{document}