使用 tikz 创建发际线

使用 tikz 创建发际线

我需要一些帮助来绘制带有细线描边的任意形状。目标:绘制透明的细线描边,该描边将显示本例中的背景海绿色、路径上的内描边和外描边。

在这个第一个示例代码中,我采用了 Inkscape 中使用的一种技术,将对象与自身进行裁剪,以生成外描边和内描边路径,然后将它们叠加在一起。外描边裁剪的实现如下:这里,归功于符号 1。

我还没有弄清楚的问题是如何添加透明细线。我在 Inkscape 中执行此操作的方法是通过将笔触转换为路径,然后使用这个新形状进行剪辑。

理想情况下,我可以为路径指定一种“橡皮擦”颜色。但实际上我想要做的是在描边线下方进行剪切。我在形状中添加了 50% 不透明度的白色描边,以演示剪切的位置。

箭头示例,演示透明细线的位置


\documentclass[boarder=7pt]{standalone}
\usepackage{fontspec}%unit code character support, advanced font configuration

\usepackage{tikz}
    \usetikzlibrary{arrows,automata,positioning,calc,backgrounds}

    % https://tex.stackexchange.com/questions/12010/how-can-i-invert-a-clip-selection-within-tikz
    \tikzset{%credit Symbol 1
        clip even odd rule/.code={\pgfseteorule}, % Credit to Andrew Stacey 
        reverseclip/.style={
            clip,insert path=
                [clip even odd rule]{
                    [reset cm](-\maxdimen,-\maxdimen)rectangle(\maxdimen,\maxdimen)
                }
        }
    }%endtikzset

\usepackage{xfp}%for fpeval{}

%here I define an arrow path

\def\arrowheight{1}
\def\arrowwidth{0.9}
\def\arrowtailratio{0.42}
\def\arrowtailwidth{0.42}
\def\arrowmidline{\fpeval{2*\arrowheight*\arrowtailratio-1}}
\def\mypath{(0,\arrowheight) -- 
    (\arrowwidth,\arrowmidline) -- 
    (\arrowtailwidth,\arrowmidline) -- 
    (\arrowtailwidth,-\arrowheight) -- 
    (-\arrowtailwidth,-\arrowheight) -- 
    (-\arrowtailwidth,\arrowmidline) -- 
    (-\arrowwidth,\arrowmidline) -- 
    cycle;}
\begin{document}
%
%
\begin{tikzpicture}[background rectangle/.style={fill=green!55!blue}, show background rectangle]
    \begin{scope}
        %create an outerstroke by reverse clipping
        \begin{pgfinterruptboundingbox}%these are needed for bounding box stuff when reverse clipping
        \path[reverseclip] (0,0) \mypath
        \end{pgfinterruptboundingbox}
        \path[draw,scale=1,line width=4,color=black,fill=black,anchor=center]
        \mypath
    \end{scope}
    \begin{scope}
        %create an innerstroke by clipping
        \path[clip] (0,0) \mypath
        \path[draw,scale=1,line width=4,color=red,draw opacity=0.8,fill=cyan,anchor=center] \mypath
    \end{scope}
    %draw my white demonstration line
    \begin{scope}
        \path[draw,line width=1,color=white, draw opacity=0.5] \mypath
    \end{scope}
\end{tikzpicture}

\end{document}

另一种可能性,虽然不是我想要的,因为它没有内部笔触,但却展示了一种非常聪明的方法这里,我已尽我所能对其进行了修改,以便与通用路径配合使用。这似乎通过在彼此顶部重复描边并减少厚度来实现。但这留下了一个问题,即如果颜色变为半透明,它会开始显示最后使用的颜色的描边颜色,而不是背景。

多笔法


\documentclass[tikz,border=7pt]{standalone}
\usetikzlibrary{shapes.symbols}


    \usetikzlibrary{arrows,automata,positioning,calc,backgrounds}
%https://tex.stackexchange.com/questions/477589/how-to-add-multiple-differently-colored-borders-around-a-node
% define the rainbow style
\tikzset{
  % next color/.style={preaction={draw=#1,next width}},
  next opacity/.style={preaction={draw=#1, draw opacity={0.5},next width}},
  next width/.code={
    \pgfkeysalso{line width/.expanded={\rainbowwidth pt}}
    \pgfmathsetmacro{\rainbowwidth}{\rainbowwidth-\rainbowstep} % decrease the rainbow width
    \xdef\rainbowwidth{\rainbowwidth} % set the rainbow width global
  },
  % rainbow/.style={next color/.list={#1}},
  rainbow/.style={next opacity/.list={#1}},
  rainbow/.prefix code={
    \edef\rainbowstep{\the\pgflinewidth}
    \foreach[count=\i]~in{#1}{} % count the number of colors
    \pgfmathsetmacro{\rainbowwidth}{\i*\rainbowstep}
  }
}

\begin{document}
\begin{tikzpicture}[background rectangle/.style={fill=green!55!blue}, show background rectangle]
    \path[fill,line width=1mm,inner sep=-4,fill=gray,rainbow={red,orange,yellow,green,blue,purple}] (0,0) -- (3,3) -- (6,0) -- cycle;
\end{tikzpicture}
\end{document}

相关内容