Tikz:将对象转换为填充路径?

Tikz:将对象转换为填充路径?

假设我有这样一个简单的 tikz“轮廓”对象,其定义如下\draw

\documentclass{standalone}

\usepackage{tikz}
    \tikzset{x=1pt, y=1pt, z=1pt}

\begin{document}

\def\object{
    \draw[blue, thick, -stealth] (0,  0)
                     .. controls (5, -5)
                             and (10, 5)
                              .. (15, 0);
}

\begin{tikzpicture}
    \object
\end{tikzpicture}

\end{document}

在此处输入图片描述

有没有办法可以将其转换为实际的\filled 路径?使用 绘制它很容易\draw,但对其进行转换(特别是衰退如果用...绘制的话会更容易\fill。但用...设计它会多么痛苦啊\fill

我知道问题在于,由于它被声明为路径,所以width理论上它没有。问题是它有宽度,否则我们看不到它。问题是:如何考虑这个实际宽度并将其转化为显式路径?

换句话说:你将如何在这个物体周围画出黑色轮廓?

(是的,我在考虑 Inkscapeobject to pathconvert to path特征。)


[编辑]如果我的理解这个相关问题是正确的,我需要从stealth较重的\makeatletter .. \makeatother部分劫持代码,以便能够检索整个箭头的实际轮廓。

但是,我实际上使用的是Stealthfrom ,如果我想更改为arrows.meta,我不希望重写代码。我正在寻找一种更通用的解决方案来检索我键入时构建的实际路径原语:它StealthLatex\draw[blue, thick, -stealth] (0, 0) .. controls (5, -5) and (10, 5) .. (15, 0);必须在某个时刻进行内部计算,否则编译将毫无意义。我如何才能得到这个中间结果?


在理想情况下,我会输入:

\getActualPath{\object}{\result}

然后\result会神奇地扩展为:

\path[cm={{0.8,0.0,0.0,-0.8,(-0.398,5.38)}}]
    (17.3457,1.2305) -- (16.9707,3.8555) .. controls (16.4721,3.4476) and
    (15.9195,3.2113) .. (15.3516,3.1621) .. controls (14.6806,3.1040) and
    (14.0125,3.2715) .. (13.3496,3.5488) .. controls (12.0238,4.1035) and
    (10.6766,5.1107) .. (9.2793,6.0215) .. controls (7.8820,6.9323) and
    (6.4476,7.7369) .. (5.0586,7.9473) .. controls (3.6696,8.1576) and
    (2.3182,7.8417) .. (0.8496,6.3730) -- (0.1465,7.0762) .. controls
    (1.7912,8.7209) and (3.5542,9.1820) .. (5.2070,8.9316) .. controls
    (6.8598,8.6813) and (8.3943,7.7895) .. (9.8242,6.8574) .. controls
    (11.2541,5.9253) and (12.5908,4.9452) .. (13.7344,4.4668) .. controls
    (14.3062,4.2276) and (14.8182,4.1155) .. (15.2656,4.1543) .. controls
    (15.6068,4.1839) and (15.9194,4.2931) .. (16.2363,4.5293) --
    (13.6836,4.8926) -- (19.1777,6.7246) -- (17.3457,1.2305) -- cycle

以便

\begin{tikzpicture}
    \result[draw, fill=blue, line width=.1pt];
\end{tikzpicture}

会画

在此处输入图片描述

\usetikzlibrary{fadings}

\begin{tikzpicture}
    \result[path fading=west, fill=blue];
\end{tikzpicture}

会画

在此处输入图片描述

\begin{tikzpicture}
    \result[clip];
    \node () at (8, 5) {\includegraphics[width=50pt]{example-image-a}};
\end{tikzpicture}

会画

在此处输入图片描述

..这不是很棒吗?

答案1

对于淡入淡出,实际上没有问题,因为我们可以淡入淡出路径或使用将scope fading我们想要的任何淡入淡出效果应用于任何路径,即使路径只是绘制而不是填充。我们可以将其同样应用于在范围内指定和绘制的路径以及预定义路径,例如\object。例如

\begin{scope}[不透明度=1,透明度组] \path [scope fading=west] (0,-2) 矩形 (3,1); \object \draw [绿色,超厚,-{Stealth[弯曲]}] (0,1) .. 控件 (1,-1) 和 (2,1) .. (3,1); \end{scope}

有一个注意事项,即当箭头指向不透明度时,该方法效果很好,但当箭头指向透明度时效果就不好了。也就是说,如果我们添加

    \draw [magenta, ultra thick, {Stealth[bend]}-] (0,-1) .. controls (1,-1) and (2,1) .. (3,-1);

在我们的范围内,结果会不太令人满意。这个问题有多大取决于透明度、箭头类型和箭头大小。

为了获得更大的灵活性,您可以定义\object一个可选参数,以便您可以编写,例如,

\object[path fading=east]

管他呢。

这也允许一个相当繁琐且不完全令人满意的解决轮廓问题的方法,因为我们可以说,例如

    \object[double=blue, draw=black, line width=.4pt, double distance=1.2pt, -{Stealth[sep=-9.5pt,fill=blue,width=1.7ex,length=2.1ex,bend]}]

近似我们箭头的轮廓版本。如果将其放置在我们上面定义的范围内,则可以进一步淡化。但是,解决方案很繁琐,箭头尖端的轮廓被完全绘制出来,我们不希望发生这种情况。

结果如下:

调整箭头

\documentclass[tikz,multi,border=10pt]{standalone}
\usetikzlibrary{bending,arrows.meta,fadings}
\begin{document}
\newcommand*\object[1][]{%
  \draw [blue, ultra thick, -{Stealth[bend]}, #1] (0,0) .. controls (1,-1) and (2,1) .. (3,0);
}
\begin{tikzpicture}
  \begin{scope}[opacity=1,transparency group]
    \path [scope fading=west] (0,-2) rectangle (3,1);
    \scoped[yshift=-15mm]{\object[double=blue, draw=black, line width=.4pt, double distance=1.2pt, -{Stealth[sep=-9.5pt,fill=blue,width=1.7ex,length=2.1ex,bend]}]}
    \object
    \draw [green, ultra thick, -{Stealth[bend]}] (0,1) .. controls (1,-1) and (2,1) .. (3,1);
    \draw [magenta, ultra thick, {Stealth[bend]}-] (0,-1) .. controls (1,-1) and (2,1) .. (3,-1);
  \end{scope}
\end{tikzpicture}
\end{document}

相关内容