TikZ:如何用特殊图案填充区域?

TikZ:如何用特殊图案填充区域?

我想可视化湍流流动状态。假设我们有一个简单的空方块,其中应该填充图案。


最小工作示例(MWE):

\documentclass{standalone}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture} 
   \draw (0, 0) rectangle (4, 4);
\end{tikzpicture}
\end{document}

我不会发布截图,因为它只是一个简单的矩形。:-)

我怎样才能用如下图案填充该矩形(右侧):

所需图案的屏幕截图

或者,对于高级 TeX 用户:如何用像这样的图案(由随机箭头组成)来填充它?

完美状态截图

感谢marmot:正如你所见,箭头永不相交——这似乎是一个挑战。

答案1

这是问题的答案

如何绘制一些不相交的随机弯曲的箭头?

不要混淆

我如何绘制某些流体的速度场?

这可能需要一个模型、Navier-Stokes 方程的解或类似的东西。也就是说,禁止交叉是朝着正确方向迈出的一步,但并没有产生物理描述。如果你有一个参数化的真实湍流速度场,你可以做得更好。

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{intersections,arrows.meta,bending} 
\newcounter{randarcs}
\begin{document}
\begin{tikzpicture}
%\draw[clip] (0,0) rectangle (4,4);
\pgfmathsetseed{21}
\foreach \X in {1,...,50}
{\pgfmathsetmacro{\myx}{-0.5+5*rnd}
\pgfmathsetmacro{\myy}{-0.5+5*rnd}
\pgfmathsetmacro{\angA}{360*rnd}
\pgfmathsetmacro{\radA}{0.3+0.3*rnd}
\pgfmathsetmacro{\myxp}{\myx+\radA*cos(\angA)}
\pgfmathsetmacro{\myyp}{\myy+\radA*sin(\angA)}
\pgfmathsetmacro{\angB}{\angA-75+150*rnd}
\pgfmathsetmacro{\radB}{\radA-0.1+0.2*rnd}
\pgfmathsetmacro{\myxq}{\myxp+\radB*cos(\angB)}
\pgfmathsetmacro{\myyq}{\myyp+\radB*sin(\angB)}
\pgfmathsetmacro{\angC}{\angB-45+90*rnd}
\pgfmathsetmacro{\radC}{\radB-0.1+0.2*rnd}
\pgfmathsetmacro{\myxr}{\myxq+\radB*cos(\angC)}
\pgfmathsetmacro{\myyr}{\myyq+\radB*sin(\angC)}
%\typeout{\angA,\radA;\angB,\radB}
\path[-{Latex},name path=test-arc] plot[smooth,tension=1] 
coordinates {(\myx,\myy) (\myxp,\myyp) (\myxq,\myyq) (\myxr,\myyr) };
\def\HasIntersection{0}
\ifnum\X>1
 \foreach \Y in {1,...,\number\value{randarcs}}
 {\path[name intersections={of=\Y-arc and test-arc,total=\t},
 /utils/exec=\ifnum\t>0
  \xdef\HasIntersection{1}%\typeout{intersects}
 \fi];
 }
\fi
\ifnum\HasIntersection=0
    \stepcounter{randarcs}
    \draw[-{Latex[bend]}] 
    plot[smooth,tension=1] coordinates {(\myx,\myy) (\myxp,\myyp)
    (\myxq,\myyq)  (\myxr,\myyr)};
    \path[name path global=\number\value{randarcs}-arc]
    plot[smooth,tension=1] coordinates {(\myx,\myy) (\myxp,\myyp)
    (\myxq,\myyq)  (\myxr,\myyr)} -- cycle;
\fi}
\end{tikzpicture}
\typeout{\number\value{randarcs}\space arcs\space drawn.}
\end{document}

在此处输入图片描述

答案2

这不是一个答案,而是一种尝试,表明某种类型的矢量艺术可以在不自己编码的情况下完成,因为这可以帮助没有高级 LateX - tikz - 数学训练的新用户制作高质量的图像。

重点是,使用 Inkscape 制作的 SVG 文件可以像纯 TeX (PStricks) 代码一样保存,然后在 LaTeX 文档中使用而不会损失质量,因为它们仍然是渲染矢量图像的代码。但遗憾的是,生成的代码,即foo.tex,无法按原样编译,并且会发出神秘警告:

%% Please note this file requires PSTricks extensions

这到底是什么意思?简单来说,你必须创建一个 LaTeX 文档,并在前言部分包含这两行:

\usepackage[pdf]{pstricks} % "pdf" to use with `pdflatex`!
\usepackage{pstricks-add}

然后在文档的某个部分(例如,在图形浮点数中)添加:

\input{foo}

结果:

在此处输入图片描述

另一个选项是将矢量图像保存为 PDF(或 EPS),可以像 软件包\includegraphics中的PNG 或 JPG 图像一样使用graphicx。这样做的好处是可以使用一些效果,例如颜色渐变或透明度,而这些效果在 PSTricks 中导出时效果不佳,还可以减少编译时间。请注意,使用 PStricks 时您不能使用 PDF,但可以使用 EPS 图像。但是,使用更新的发行版,您仍然可以使用软件包的pdflatex选项。[pdf]pstricks

mwe2

完整 MWE:

\documentclass[twocolumn]{article}
\usepackage{graphicx}
\usepackage[pdf]{pstricks} % "pdf" to use with `pdflatex`!
\usepackage{pstricks-add}

\begin{document}

\begin{figure}
\centering
\input{foo2} % foo2.tex directly saved with Inkscape with a pspicture  
\caption{A pstricks draw made with Inkscape. Only \TeX\ code here.}
\end{figure}


\begin{figure}[h]
\centering
\includegraphics{foo.eps}
\caption{EPS -- PDF version with gradients.}
\label{}
\end{figure}


\end{document}

注意:的代码foo.tex太长,无法发布,而且由于是手动绘制而自动生成的,因此很少有人感兴趣。如果您想知道该代码是怎样的,请看下面的简单绘制:

\psset{xunit=.5pt,yunit=.51pt,runit=1pt}

\begin{pspicture}(800,1000)
{\newrgbcolor{curcolor}{.8 .9 .8} % Box
\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]{
\newpath\moveto(137,991)\lineto(534,991)\lineto(534,668)
\lineto(137,668)\closepath}}

{\newrgbcolor{curcolor}{1 .2 1} % line
\pscustom[linewidth=4,linecolor=curcolor]{
\newpath\moveto(147,677)
\curveto(147,677)(191,876)(328,851)
\curveto(466,826)(506,820)(475,961)}}

{\newrgbcolor{curcolor}{.4 .8 .4} % arrowhead head
\pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]{
\newpath\moveto(465,918)\lineto(473,970)\lineto(501,926)
\curveto(489,931)(474,928)(465,918)\closepath}}

{\newrgbcolor{curcolor}{0 0 1} % arrowhead border
\pscustom[linewidth=4,linecolor=curcolor]{
\newpath\moveto(465,918)\lineto(473,970)\lineto(501,926)
\curveto(489,931)(474,928)(465,918)\closepath}}
\end{pspicture}}

我以同样的方式重新创建了湍流图像作为练习。但是,图像的方程式是使用以下 LaTeX 代码排版的(在 Inkscape 中):

\frac{ \partial \overline{u_{i}} }{\partial t} +
\overline{u_{j}} \frac{ \partial \overline{u_{i}} }{ \partial x_{j} } =
- \frac{1}{\rho} \frac{\partial \overline{p} }{ \partial x_{i} }
   + \frac{1}{\rho} \frac{\partial}{\partial x_{j}} 
\left( \mu \frac{\partial \overline{u_{i}}}{\partial x_{j}} -
              \rho \overline{u_i^\prime u_j^\prime } \right) 

相关内容