自相交线/曲线的装饰

自相交线/曲线的装饰

是否可以定义一个装饰/后动作,用于绘制双线,以便自相交线绘制在其自身之上?为了说明我的意思,请看这些螺旋:

\documentclass[tikz, border=1cm]{standalone}
\begin{document}
\begin{tikzpicture}
\draw[red, double=yellow, thick, domain=0:pi, smooth, samples=200] plot (\x, {cos(10*\x r)} , {sin(10*\x r)} );
\begin{scope}[yshift=-3cm]
\foreach \i in {1,...,10}
\draw[red, double=yellow, thick, domain=pi*(\i-1)/10:pi*\i/10, smooth, samples=200] plot (\x, {cos(10*\x r)} , {sin(10*\x r)} );
\end{scope}
\end{tikzpicture}
\end{document}

两个螺旋

上面的螺旋线显示了正常双线的效果,下面的螺旋线显示了所需的结果。我希望只用一个\draw命令就能完成结果,以避免渲染伪影,并使smooth选项在整个螺旋线上起作用。

最终,我希望能够使用白色作为外部颜色,从而产生交叉效果。为了能够更好地回答本网站上的问题,例如 圆锥螺旋和圆柱螺旋

我认为,通过在绘制路径时对路径的小段进行重复,应该可以实现这一点。一个简单的方法如下:

\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary {decorations.pathmorphing}
\begin{document}
\begin{tikzpicture}
\draw[yellow, 
decorate, decoration={zigzag, segment length=1mm, amplitude=0mm},
preaction={draw, ultra thick, red},
domain=0:pi, samples=200] plot (\x, {cos(10*\x r)} , {sin(10*\x r)} );
\end{tikzpicture}
\end{document}

不起作用,因为预操作应用于整个路径而不是段。

更好的解决方案是,如果路径可以clip自行改变,那么交叉口在非白色背景上看起来会很漂亮。- 可能相当复杂。

答案1

这里提供一种方法show path construction

\documentclass[tikz, border=1cm]{standalone}
\usetikzlibrary{decorations.pathreplacing}
\begin{document}
\begin{tikzpicture}[path decomposition/.style={%
    postaction={decoration={show path construction,
    lineto code={
      \draw[#1]  (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast);
    },
    curveto code={
      \draw[#1]  (\tikzinputsegmentfirst) .. controls
        (\tikzinputsegmentsupporta) and (\tikzinputsegmentsupportb)
        ..(\tikzinputsegmentlast) ;
    },
    closepath code={
      \draw[#1]  (\tikzinputsegmentfirst) -- (\tikzinputsegmentlast) {closepath};} }
    ,decorate}}]
\draw[red, double=yellow, thick, domain=0:pi, smooth, samples=200,
path decomposition={red, double=yellow, thick}] plot (\x, {cos(10*\x r)} , {sin(10*\x r)} );
\begin{scope}[yshift=-3cm]
\foreach \i in {1,...,10}
\draw[red, double=yellow, thick, domain=pi*(\i-1)/10:pi*\i/10, smooth, samples=200] plot (\x, {cos(10*\x r)} , {sin(10*\x r)} );
\end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

请注意,已经有完整的样式了这个答案

答案2

knotsTikZ 库可以处理这类事情。使用plot绘图命令时会出现一个小问题,因为这会创建一个很多非常短的线,这对于它的工作方式来说并不好,knots因为它寻找子路径之间的交点。幸运的是,使用hobby由于库使用贝塞尔曲线进行插值,因此我可以大大减少样本的数量。

knots库的工作原理是重新绘制交叉路口处的部分曲线来产生立交桥效果。

使用库中的 double 选项knots可能会在查看 PDF 时产生伪影(但不会在打印时产生伪影)。有关如何去除伪影的详细说明,请参阅tikz 结库中的“麦田怪圈”问题

代码如下:

\documentclass{article}
%\url{https://tex.stackexchange.com/q/572737/86}
\usepackage{tikz}
\usetikzlibrary{knots,hobby}

\tikzset{
  basic strand/.style={
    red,
    double=yellow,
    double distance=1pt,
  },
  crossing strand/.style={
    line width=1.8pt,
    only when rendering/.style={%
      draw=yellow,%
      line width=1pt,
      double=none,
    }
  }
}

\begin{document}
\begin{tikzpicture}[use Hobby shortcut]
\begin{knot}[
  consider self intersections=true,
  ignore endpoint intersections=false,
  background colour=red,
  every intersection/.style={
    crossing strand
  },
  only when rendering/.style={
    basic strand
  },
  clip width=1
]
\strand (0,1,0) \foreach \x in {1,...,80} { .. (\x/80*pi, {cos(22.5*\x )} , {sin(22.5*\x )} ) };
\end{knot}
\end{tikzpicture}
\end{document}

结果:

具有叠加效果的线圈

相关内容