如何偏移爱好曲线,以便最终的曲线成为原始曲线的移位和平行轮廓?这是我目前得到的结果:
\documentclass[border=5pt,tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc,hobby}
\tikzset{
point/.style={circle,inner sep=0pt,minimum size=3pt,fill=red},
}
\begin{document}
\begin{tikzpicture}
\coordinate [label=below right:$A$] (A) at (0,0);
\coordinate [label=above right:$B$] (B) at (0,-5);
\coordinate [label=above left:$C$] (C) at (2.5,-3);
\coordinate [label=above left:$D$] (D) at (5,-2);
\coordinate [label=below left:$E$] (E) at (4.5,0);
\draw (A) -- (B);
\draw ([out angle=0]B) to [curve through ={(C)}] ([in angle=-135]D);
\draw (D) -- (E);
\draw (E) -- (A);
\draw[blue,dashed] (A) -- ([xshift=-.3cm]A);
\draw[blue,dashed] ([xshift=-.3cm]A) -- ([xshift=-.3cm]B);
\draw[blue,dashed] ([xshift=-.3cm]B) to[out=-90,in=180] ([yshift=-.3cm]B);
\draw[blue,dashed] ([out angle=0,yshift=-.3cm]B) to [curve through ={([yshift=-.3cm]C)}] ([in angle=-135,yshift=-.3cm]D);
\node[point] at (A) {};
\node[point] at (B) {};
\node[point] at (C) {};
\node[point] at (D) {};
\node[point] at (E) {};
\end{tikzpicture}
\end{document}
可以看到,从 A 到 B 的蓝色虚线与原线相距 0.3cm。但是,蓝色虚线曲线与原曲线的距离并不是恒定的。
我尝试了 JLDiaz 的解决方案这帖子,只要你不使用爱好曲线,它就可以完美地工作,因为它们似乎不支持坐标[pos=xxx]解决方案中使用的选项。使用常规曲线代替业余曲线对我来说不是一个选择,因为业余曲线会产生更好的“流动”。
我认为并行移动某些东西是一项很常见的任务,一定有更简单的方法来完成它,对吗?有人能给我指出正确的方向吗?
答案1
如果不做大量的工作,默认情况下 TikZ 可以做到的最好事情就是这样。它几乎已经完成了,但解决问题却非常棘手。
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{calc,hobby,decorations}
\tikzset{
point/.style={circle,inner sep=0pt,minimum size=3pt,fill=red},
}
\begin{document}
\begin{tikzpicture}
\coordinate [label=below right:$A$] (A) at (0,0);
\coordinate [label=above right:$B$] (B) at (0,-5);
\coordinate [label=above left:$C$] (C) at (2.5,-3);
\coordinate [label=above left:$D$] (D) at (5,-2);
\coordinate [label=below left:$E$] (E) at (4.5,0);
\draw
(A) -- (B) to [out angle=0, in angle=-135, curve through=(C)]
(D) -- (E) -- cycle;
\draw [decoration={curveto, raise=-0.3cm}, decorate, blue, dashed]
(A) -- (B) to [out angle=0, in angle=-135, curve through=(C)]
(D) -- (E) -- cycle;
\foreach \n in {A,...,E}
\node[point] at (\n) {};
\end{tikzpicture}
\end{document}
然而,考虑到这个答案,这是用于外置的装饰,它实际上并不是非常有效,并且对于连续路径之间的外角为锐角或内角非常小的路径可能会失败。但对于当前示例来说,它至少是可以通过的。基本思想是在拐角处用直线延伸每条路径,类似于斜接中采用的方法。它可能会给 metapost-guys 一些想法 ;)
答案2
这是一项奇怪的棘手任务。我曾多次尝试为这个问题提出一个强大的解决方案,但从未得到非常令人满意或普遍的结果。但这是我最新的努力。这是元帖子但它可能会给 tikz-guys 一些想法。
mpost
用...编译
prologues := 3;
outputtemplate := "%j%c.eps";
beginfig(1);
numeric u; u = 1cm;
path shape;
shape = ( origin -- (0,-5) { right } .. (5/2,-3) .. { dir 45 } (5,-2) -- (9/2,0) -- cycle ) scaled u;
draw shape;
for t=0 upto 4:
fill fullcircle scaled 3 shifted point t of shape withcolor red;
label(char (65+t), 6 up rotated angle direction t+1/16 of shape shifted point t+1/16 of shape);
endfor
path C; C = fullcircle scaled 20;
numeric a, b, s; s=1/4;
draw for t=s step s until length shape:
hide(
a := directiontime (point t of shape - precontrol t of shape) of C;
b := directiontime (postcontrol t of shape - point t of shape) of C;
if b<a: a:= a-8; fi
% uncomment this draw command to see the contruction circles...
% draw C shifted point t of shape withcolor .8[red,white];
)
subpath (a,b) of C shifted point t of shape {direction t+eps of shape} ..
endfor cycle dashed evenly;
endfig;
end.
这里的想法是使用路径上每一步的控制前点和控制后点来定义一个合适的圆弧,然后连接所有这些圆弧。如果三个控制点在一条线上,这个圆弧将是一个点(这就是我们想要的)。减小步长可以改善周围曲线的形状,但如果步长太小,就会产生一些额外的循环伪影。这就是我说它不是一种非常可靠的方法的意思。但我希望它至少能提供一些启发。
在我这样做的同时,您还可以尝试另一种技巧:用粗笔绘画,然后擦除内部内容。
beginfig(2);
draw shape withpen pencircle scaled 12 withcolor blue;
undraw shape withpen pencircle scaled 11;
unfill shape;
draw shape;
endfig;
按照shape
第一张图的定义,得到:
但不要尝试用这么粗的笔添加虚线图案,它会看起来很奇怪。unfill shape
摆脱了线条里面形状。