TikZ: How to fill area with a special pattern?
I want to visualize a turbulent flow regime. Assumed we have a simple empty square that should be filled with a pattern.
Minimum Working Example (MWE):
documentclass{standalone}
usepackage{tikz}
begin{document}
begin{tikzpicture}
draw (0, 0) rectangle (4, 4);
end{tikzpicture}
end{document}
I won't post a screenshot, because it is just a simple rectangle. :-)
How can I fill this rectangle with a pattern like this on the right side:

Or, for the advanced TeX-users: How to fill it with a pattern like this one (made of random arrows)?

Thanks to marmot: As you can see, the arrows never intersect - this seems to be a challenge.
tikz-pgf tikz-arrows draw fill pattern
add a comment |
I want to visualize a turbulent flow regime. Assumed we have a simple empty square that should be filled with a pattern.
Minimum Working Example (MWE):
documentclass{standalone}
usepackage{tikz}
begin{document}
begin{tikzpicture}
draw (0, 0) rectangle (4, 4);
end{tikzpicture}
end{document}
I won't post a screenshot, because it is just a simple rectangle. :-)
How can I fill this rectangle with a pattern like this on the right side:

Or, for the advanced TeX-users: How to fill it with a pattern like this one (made of random arrows)?

Thanks to marmot: As you can see, the arrows never intersect - this seems to be a challenge.
tikz-pgf tikz-arrows draw fill pattern
Here is a question on randomly curved arrows. It is not difficult to draw random arrows, but if I interpret your question correctly, they should not intersect. Avoiding intersections is probably more efforts. So I wish to clarify: you do not want the arrows to intersect?
– marmot
Mar 31 at 16:35
@marmot: Thanks for your comment - you are completely right! The arrows should not intersect, because the fluid can not cross in reality.
– Dave
Mar 31 at 16:48
1
As a proof of concept, I'm very interested in how this can be coded (+1 to mamot, indeed) but from a practical point of view (time and result quality) I would do it manually in Inkscape.
– Fran
Mar 31 at 18:09
@Fran: I took me the whole weekend to put and adjust some spirals into mytikzpicture. Therefore I am curious if there is a better solution available for it.
– Dave
Mar 31 at 18:12
add a comment |
I want to visualize a turbulent flow regime. Assumed we have a simple empty square that should be filled with a pattern.
Minimum Working Example (MWE):
documentclass{standalone}
usepackage{tikz}
begin{document}
begin{tikzpicture}
draw (0, 0) rectangle (4, 4);
end{tikzpicture}
end{document}
I won't post a screenshot, because it is just a simple rectangle. :-)
How can I fill this rectangle with a pattern like this on the right side:

Or, for the advanced TeX-users: How to fill it with a pattern like this one (made of random arrows)?

Thanks to marmot: As you can see, the arrows never intersect - this seems to be a challenge.
tikz-pgf tikz-arrows draw fill pattern
I want to visualize a turbulent flow regime. Assumed we have a simple empty square that should be filled with a pattern.
Minimum Working Example (MWE):
documentclass{standalone}
usepackage{tikz}
begin{document}
begin{tikzpicture}
draw (0, 0) rectangle (4, 4);
end{tikzpicture}
end{document}
I won't post a screenshot, because it is just a simple rectangle. :-)
How can I fill this rectangle with a pattern like this on the right side:

Or, for the advanced TeX-users: How to fill it with a pattern like this one (made of random arrows)?

Thanks to marmot: As you can see, the arrows never intersect - this seems to be a challenge.
tikz-pgf tikz-arrows draw fill pattern
tikz-pgf tikz-arrows draw fill pattern
edited Mar 31 at 16:51
Dave
asked Mar 31 at 16:29
DaveDave
1,185619
1,185619
Here is a question on randomly curved arrows. It is not difficult to draw random arrows, but if I interpret your question correctly, they should not intersect. Avoiding intersections is probably more efforts. So I wish to clarify: you do not want the arrows to intersect?
– marmot
Mar 31 at 16:35
@marmot: Thanks for your comment - you are completely right! The arrows should not intersect, because the fluid can not cross in reality.
– Dave
Mar 31 at 16:48
1
As a proof of concept, I'm very interested in how this can be coded (+1 to mamot, indeed) but from a practical point of view (time and result quality) I would do it manually in Inkscape.
– Fran
Mar 31 at 18:09
@Fran: I took me the whole weekend to put and adjust some spirals into mytikzpicture. Therefore I am curious if there is a better solution available for it.
– Dave
Mar 31 at 18:12
add a comment |
Here is a question on randomly curved arrows. It is not difficult to draw random arrows, but if I interpret your question correctly, they should not intersect. Avoiding intersections is probably more efforts. So I wish to clarify: you do not want the arrows to intersect?
– marmot
Mar 31 at 16:35
@marmot: Thanks for your comment - you are completely right! The arrows should not intersect, because the fluid can not cross in reality.
– Dave
Mar 31 at 16:48
1
As a proof of concept, I'm very interested in how this can be coded (+1 to mamot, indeed) but from a practical point of view (time and result quality) I would do it manually in Inkscape.
– Fran
Mar 31 at 18:09
@Fran: I took me the whole weekend to put and adjust some spirals into mytikzpicture. Therefore I am curious if there is a better solution available for it.
– Dave
Mar 31 at 18:12
Here is a question on randomly curved arrows. It is not difficult to draw random arrows, but if I interpret your question correctly, they should not intersect. Avoiding intersections is probably more efforts. So I wish to clarify: you do not want the arrows to intersect?
– marmot
Mar 31 at 16:35
Here is a question on randomly curved arrows. It is not difficult to draw random arrows, but if I interpret your question correctly, they should not intersect. Avoiding intersections is probably more efforts. So I wish to clarify: you do not want the arrows to intersect?
– marmot
Mar 31 at 16:35
@marmot: Thanks for your comment - you are completely right! The arrows should not intersect, because the fluid can not cross in reality.
– Dave
Mar 31 at 16:48
@marmot: Thanks for your comment - you are completely right! The arrows should not intersect, because the fluid can not cross in reality.
– Dave
Mar 31 at 16:48
1
1
As a proof of concept, I'm very interested in how this can be coded (+1 to mamot, indeed) but from a practical point of view (time and result quality) I would do it manually in Inkscape.
– Fran
Mar 31 at 18:09
As a proof of concept, I'm very interested in how this can be coded (+1 to mamot, indeed) but from a practical point of view (time and result quality) I would do it manually in Inkscape.
– Fran
Mar 31 at 18:09
@Fran: I took me the whole weekend to put and adjust some spirals into my
tikzpicture. Therefore I am curious if there is a better solution available for it.– Dave
Mar 31 at 18:12
@Fran: I took me the whole weekend to put and adjust some spirals into my
tikzpicture. Therefore I am curious if there is a better solution available for it.– Dave
Mar 31 at 18:12
add a comment |
2 Answers
2
active
oldest
votes
This is an answer to the question
How can one draw some randomly curved arrows that do not intersect?
which is not to be confused with
How can I draw the velocity field of some fluid?
which may require a model, a solution of the Navier-Stokes equations or something of that sort. That is, forbidding intersections is a step in the right direction but does not yield a physical description. If you do have the parametrization a realistic turbulent velocity field, you can do much better.
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) };
defHasIntersection{0}
ifnumX>1
foreach Y in {1,...,numbervalue{randarcs}}
{path[name intersections={of=Y-arc and test-arc,total=t},
/utils/exec=ifnumt>0
xdefHasIntersection{1}%typeout{intersects}
fi];
}
fi
ifnumHasIntersection=0
stepcounter{randarcs}
draw[-{Latex[bend]}]
plot[smooth,tension=1] coordinates {(myx,myy) (myxp,myyp)
(myxq,myyq) (myxr,myyr)};
path[name path global=numbervalue{randarcs}-arc]
plot[smooth,tension=1] coordinates {(myx,myy) (myxp,myyp)
(myxq,myyq) (myxr,myyr)} -- cycle;
fi}
end{tikzpicture}
typeout{numbervalue{randarcs}space arcsspace drawn.}
end{document}

Awesome, thank you very much! :-) Would it be possible to get the arrows a bit more "smooth"? They seem to be very edgy.
– Dave
Mar 31 at 18:07
1
@Dave I changed some parameters. In addition, you can play with tension. E.g. replace alltension=1withtension=1.6. It also helps to play withpgfmathsetseed{21}.
– marmot
Mar 31 at 18:23
add a comment |
This is not an answer but an attempt to show that some type of vectorial art could be done without coding yourself as this could help to new users without a high LateX - tikz - maths training to produce high quality images.
The main point is that SVG files made with Inkscape, can be saved like pure TeX (PStricks) code and then used in a LaTeX document without loss of quality because are still a code to render a vectorial image. But sadly , the generated coded, said foo.tex, is not compilable as is, and will cryptically warning you:
%% Please note this file requires PSTricks extensions
What the hell mean that? Simply that you must make a LaTeX document with this two lines in the preamble::
usepackage[pdf]{pstricks} % "pdf" to use with `pdflatex`!
usepackage{pstricks-add}
And then in some part of your document (in a figure float, for instance) add:
input{foo}
The result:
The other option is save the vectorial image as PDF (or EPS), that can be used just like any PNG or JPG image with the usual includegraphics of the graphicx package. This have the advantage that can use some effects as color gradients or transparencies that are not well exported to PSTricks and also reduce the compilation time. Note that using PStricks you cannot use the PDF but the EPS images. However with an updated distribution you still can use pdflatex using the option [pdf] of pstricks package.
Full 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}
Note: The code of foo.texis too long to be posted and of scarce interest since is automatically generated from a manual draw. If you are curious about how is that code, is like this simple draw:
psset{xunit=.5pt,yunit=.51pt,runit=1pt}
begin{pspicture}(800,1000)
{newrgbcolor{curcolor}{.8 .9 .8} % Box
pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]{
newpathmoveto(137,991)lineto(534,991)lineto(534,668)
lineto(137,668)closepath}}
{newrgbcolor{curcolor}{1 .2 1} % line
pscustom[linewidth=4,linecolor=curcolor]{
newpathmoveto(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]{
newpathmoveto(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]{
newpathmoveto(465,918)lineto(473,970)lineto(501,926)
curveto(489,931)(474,928)(465,918)closepath}}
end{pspicture}}
I left as exercise recreate the turbulence image in the same way. However, the equation of the image was typeset (inside Inkscape) using this LaTeX code:
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)
1
Very nice! +1. Perhaps you could also add thatpotracehas the ability to convert an existing bitmap to a vector graphics format. The latter can be loaded in inkscape and then converted to svg, TikZ or PSTricks. This way you do not even have to draw the arcs in inkscape.
– marmot
2 days ago
1
@marmot Inkscape can also nicely vectorize bitmaps (and even show a preview according to the settings). These tools are really useful for complex shapes like human silhouettes, but objects like arrow tails are traced as shapes instead as single bezier curve, so any fix of control points in these closely parallel curves, including convert the shape it single line, is a pain. Instead, draw manually a single line with 3-4 controls points is a child play, and the line will be always of the same fixed width. So for this case I was the tracing tool. :)
– Fran
2 days ago
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "85"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f482462%2ftikz-how-to-fill-area-with-a-special-pattern%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
This is an answer to the question
How can one draw some randomly curved arrows that do not intersect?
which is not to be confused with
How can I draw the velocity field of some fluid?
which may require a model, a solution of the Navier-Stokes equations or something of that sort. That is, forbidding intersections is a step in the right direction but does not yield a physical description. If you do have the parametrization a realistic turbulent velocity field, you can do much better.
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) };
defHasIntersection{0}
ifnumX>1
foreach Y in {1,...,numbervalue{randarcs}}
{path[name intersections={of=Y-arc and test-arc,total=t},
/utils/exec=ifnumt>0
xdefHasIntersection{1}%typeout{intersects}
fi];
}
fi
ifnumHasIntersection=0
stepcounter{randarcs}
draw[-{Latex[bend]}]
plot[smooth,tension=1] coordinates {(myx,myy) (myxp,myyp)
(myxq,myyq) (myxr,myyr)};
path[name path global=numbervalue{randarcs}-arc]
plot[smooth,tension=1] coordinates {(myx,myy) (myxp,myyp)
(myxq,myyq) (myxr,myyr)} -- cycle;
fi}
end{tikzpicture}
typeout{numbervalue{randarcs}space arcsspace drawn.}
end{document}

Awesome, thank you very much! :-) Would it be possible to get the arrows a bit more "smooth"? They seem to be very edgy.
– Dave
Mar 31 at 18:07
1
@Dave I changed some parameters. In addition, you can play with tension. E.g. replace alltension=1withtension=1.6. It also helps to play withpgfmathsetseed{21}.
– marmot
Mar 31 at 18:23
add a comment |
This is an answer to the question
How can one draw some randomly curved arrows that do not intersect?
which is not to be confused with
How can I draw the velocity field of some fluid?
which may require a model, a solution of the Navier-Stokes equations or something of that sort. That is, forbidding intersections is a step in the right direction but does not yield a physical description. If you do have the parametrization a realistic turbulent velocity field, you can do much better.
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) };
defHasIntersection{0}
ifnumX>1
foreach Y in {1,...,numbervalue{randarcs}}
{path[name intersections={of=Y-arc and test-arc,total=t},
/utils/exec=ifnumt>0
xdefHasIntersection{1}%typeout{intersects}
fi];
}
fi
ifnumHasIntersection=0
stepcounter{randarcs}
draw[-{Latex[bend]}]
plot[smooth,tension=1] coordinates {(myx,myy) (myxp,myyp)
(myxq,myyq) (myxr,myyr)};
path[name path global=numbervalue{randarcs}-arc]
plot[smooth,tension=1] coordinates {(myx,myy) (myxp,myyp)
(myxq,myyq) (myxr,myyr)} -- cycle;
fi}
end{tikzpicture}
typeout{numbervalue{randarcs}space arcsspace drawn.}
end{document}

Awesome, thank you very much! :-) Would it be possible to get the arrows a bit more "smooth"? They seem to be very edgy.
– Dave
Mar 31 at 18:07
1
@Dave I changed some parameters. In addition, you can play with tension. E.g. replace alltension=1withtension=1.6. It also helps to play withpgfmathsetseed{21}.
– marmot
Mar 31 at 18:23
add a comment |
This is an answer to the question
How can one draw some randomly curved arrows that do not intersect?
which is not to be confused with
How can I draw the velocity field of some fluid?
which may require a model, a solution of the Navier-Stokes equations or something of that sort. That is, forbidding intersections is a step in the right direction but does not yield a physical description. If you do have the parametrization a realistic turbulent velocity field, you can do much better.
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) };
defHasIntersection{0}
ifnumX>1
foreach Y in {1,...,numbervalue{randarcs}}
{path[name intersections={of=Y-arc and test-arc,total=t},
/utils/exec=ifnumt>0
xdefHasIntersection{1}%typeout{intersects}
fi];
}
fi
ifnumHasIntersection=0
stepcounter{randarcs}
draw[-{Latex[bend]}]
plot[smooth,tension=1] coordinates {(myx,myy) (myxp,myyp)
(myxq,myyq) (myxr,myyr)};
path[name path global=numbervalue{randarcs}-arc]
plot[smooth,tension=1] coordinates {(myx,myy) (myxp,myyp)
(myxq,myyq) (myxr,myyr)} -- cycle;
fi}
end{tikzpicture}
typeout{numbervalue{randarcs}space arcsspace drawn.}
end{document}

This is an answer to the question
How can one draw some randomly curved arrows that do not intersect?
which is not to be confused with
How can I draw the velocity field of some fluid?
which may require a model, a solution of the Navier-Stokes equations or something of that sort. That is, forbidding intersections is a step in the right direction but does not yield a physical description. If you do have the parametrization a realistic turbulent velocity field, you can do much better.
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) };
defHasIntersection{0}
ifnumX>1
foreach Y in {1,...,numbervalue{randarcs}}
{path[name intersections={of=Y-arc and test-arc,total=t},
/utils/exec=ifnumt>0
xdefHasIntersection{1}%typeout{intersects}
fi];
}
fi
ifnumHasIntersection=0
stepcounter{randarcs}
draw[-{Latex[bend]}]
plot[smooth,tension=1] coordinates {(myx,myy) (myxp,myyp)
(myxq,myyq) (myxr,myyr)};
path[name path global=numbervalue{randarcs}-arc]
plot[smooth,tension=1] coordinates {(myx,myy) (myxp,myyp)
(myxq,myyq) (myxr,myyr)} -- cycle;
fi}
end{tikzpicture}
typeout{numbervalue{randarcs}space arcsspace drawn.}
end{document}

edited Mar 31 at 18:22
answered Mar 31 at 17:34
marmotmarmot
114k5145276
114k5145276
Awesome, thank you very much! :-) Would it be possible to get the arrows a bit more "smooth"? They seem to be very edgy.
– Dave
Mar 31 at 18:07
1
@Dave I changed some parameters. In addition, you can play with tension. E.g. replace alltension=1withtension=1.6. It also helps to play withpgfmathsetseed{21}.
– marmot
Mar 31 at 18:23
add a comment |
Awesome, thank you very much! :-) Would it be possible to get the arrows a bit more "smooth"? They seem to be very edgy.
– Dave
Mar 31 at 18:07
1
@Dave I changed some parameters. In addition, you can play with tension. E.g. replace alltension=1withtension=1.6. It also helps to play withpgfmathsetseed{21}.
– marmot
Mar 31 at 18:23
Awesome, thank you very much! :-) Would it be possible to get the arrows a bit more "smooth"? They seem to be very edgy.
– Dave
Mar 31 at 18:07
Awesome, thank you very much! :-) Would it be possible to get the arrows a bit more "smooth"? They seem to be very edgy.
– Dave
Mar 31 at 18:07
1
1
@Dave I changed some parameters. In addition, you can play with tension. E.g. replace all
tension=1 with tension=1.6. It also helps to play with pgfmathsetseed{21}.– marmot
Mar 31 at 18:23
@Dave I changed some parameters. In addition, you can play with tension. E.g. replace all
tension=1 with tension=1.6. It also helps to play with pgfmathsetseed{21}.– marmot
Mar 31 at 18:23
add a comment |
This is not an answer but an attempt to show that some type of vectorial art could be done without coding yourself as this could help to new users without a high LateX - tikz - maths training to produce high quality images.
The main point is that SVG files made with Inkscape, can be saved like pure TeX (PStricks) code and then used in a LaTeX document without loss of quality because are still a code to render a vectorial image. But sadly , the generated coded, said foo.tex, is not compilable as is, and will cryptically warning you:
%% Please note this file requires PSTricks extensions
What the hell mean that? Simply that you must make a LaTeX document with this two lines in the preamble::
usepackage[pdf]{pstricks} % "pdf" to use with `pdflatex`!
usepackage{pstricks-add}
And then in some part of your document (in a figure float, for instance) add:
input{foo}
The result:
The other option is save the vectorial image as PDF (or EPS), that can be used just like any PNG or JPG image with the usual includegraphics of the graphicx package. This have the advantage that can use some effects as color gradients or transparencies that are not well exported to PSTricks and also reduce the compilation time. Note that using PStricks you cannot use the PDF but the EPS images. However with an updated distribution you still can use pdflatex using the option [pdf] of pstricks package.
Full 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}
Note: The code of foo.texis too long to be posted and of scarce interest since is automatically generated from a manual draw. If you are curious about how is that code, is like this simple draw:
psset{xunit=.5pt,yunit=.51pt,runit=1pt}
begin{pspicture}(800,1000)
{newrgbcolor{curcolor}{.8 .9 .8} % Box
pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]{
newpathmoveto(137,991)lineto(534,991)lineto(534,668)
lineto(137,668)closepath}}
{newrgbcolor{curcolor}{1 .2 1} % line
pscustom[linewidth=4,linecolor=curcolor]{
newpathmoveto(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]{
newpathmoveto(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]{
newpathmoveto(465,918)lineto(473,970)lineto(501,926)
curveto(489,931)(474,928)(465,918)closepath}}
end{pspicture}}
I left as exercise recreate the turbulence image in the same way. However, the equation of the image was typeset (inside Inkscape) using this LaTeX code:
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)
1
Very nice! +1. Perhaps you could also add thatpotracehas the ability to convert an existing bitmap to a vector graphics format. The latter can be loaded in inkscape and then converted to svg, TikZ or PSTricks. This way you do not even have to draw the arcs in inkscape.
– marmot
2 days ago
1
@marmot Inkscape can also nicely vectorize bitmaps (and even show a preview according to the settings). These tools are really useful for complex shapes like human silhouettes, but objects like arrow tails are traced as shapes instead as single bezier curve, so any fix of control points in these closely parallel curves, including convert the shape it single line, is a pain. Instead, draw manually a single line with 3-4 controls points is a child play, and the line will be always of the same fixed width. So for this case I was the tracing tool. :)
– Fran
2 days ago
add a comment |
This is not an answer but an attempt to show that some type of vectorial art could be done without coding yourself as this could help to new users without a high LateX - tikz - maths training to produce high quality images.
The main point is that SVG files made with Inkscape, can be saved like pure TeX (PStricks) code and then used in a LaTeX document without loss of quality because are still a code to render a vectorial image. But sadly , the generated coded, said foo.tex, is not compilable as is, and will cryptically warning you:
%% Please note this file requires PSTricks extensions
What the hell mean that? Simply that you must make a LaTeX document with this two lines in the preamble::
usepackage[pdf]{pstricks} % "pdf" to use with `pdflatex`!
usepackage{pstricks-add}
And then in some part of your document (in a figure float, for instance) add:
input{foo}
The result:
The other option is save the vectorial image as PDF (or EPS), that can be used just like any PNG or JPG image with the usual includegraphics of the graphicx package. This have the advantage that can use some effects as color gradients or transparencies that are not well exported to PSTricks and also reduce the compilation time. Note that using PStricks you cannot use the PDF but the EPS images. However with an updated distribution you still can use pdflatex using the option [pdf] of pstricks package.
Full 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}
Note: The code of foo.texis too long to be posted and of scarce interest since is automatically generated from a manual draw. If you are curious about how is that code, is like this simple draw:
psset{xunit=.5pt,yunit=.51pt,runit=1pt}
begin{pspicture}(800,1000)
{newrgbcolor{curcolor}{.8 .9 .8} % Box
pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]{
newpathmoveto(137,991)lineto(534,991)lineto(534,668)
lineto(137,668)closepath}}
{newrgbcolor{curcolor}{1 .2 1} % line
pscustom[linewidth=4,linecolor=curcolor]{
newpathmoveto(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]{
newpathmoveto(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]{
newpathmoveto(465,918)lineto(473,970)lineto(501,926)
curveto(489,931)(474,928)(465,918)closepath}}
end{pspicture}}
I left as exercise recreate the turbulence image in the same way. However, the equation of the image was typeset (inside Inkscape) using this LaTeX code:
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)
1
Very nice! +1. Perhaps you could also add thatpotracehas the ability to convert an existing bitmap to a vector graphics format. The latter can be loaded in inkscape and then converted to svg, TikZ or PSTricks. This way you do not even have to draw the arcs in inkscape.
– marmot
2 days ago
1
@marmot Inkscape can also nicely vectorize bitmaps (and even show a preview according to the settings). These tools are really useful for complex shapes like human silhouettes, but objects like arrow tails are traced as shapes instead as single bezier curve, so any fix of control points in these closely parallel curves, including convert the shape it single line, is a pain. Instead, draw manually a single line with 3-4 controls points is a child play, and the line will be always of the same fixed width. So for this case I was the tracing tool. :)
– Fran
2 days ago
add a comment |
This is not an answer but an attempt to show that some type of vectorial art could be done without coding yourself as this could help to new users without a high LateX - tikz - maths training to produce high quality images.
The main point is that SVG files made with Inkscape, can be saved like pure TeX (PStricks) code and then used in a LaTeX document without loss of quality because are still a code to render a vectorial image. But sadly , the generated coded, said foo.tex, is not compilable as is, and will cryptically warning you:
%% Please note this file requires PSTricks extensions
What the hell mean that? Simply that you must make a LaTeX document with this two lines in the preamble::
usepackage[pdf]{pstricks} % "pdf" to use with `pdflatex`!
usepackage{pstricks-add}
And then in some part of your document (in a figure float, for instance) add:
input{foo}
The result:
The other option is save the vectorial image as PDF (or EPS), that can be used just like any PNG or JPG image with the usual includegraphics of the graphicx package. This have the advantage that can use some effects as color gradients or transparencies that are not well exported to PSTricks and also reduce the compilation time. Note that using PStricks you cannot use the PDF but the EPS images. However with an updated distribution you still can use pdflatex using the option [pdf] of pstricks package.
Full 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}
Note: The code of foo.texis too long to be posted and of scarce interest since is automatically generated from a manual draw. If you are curious about how is that code, is like this simple draw:
psset{xunit=.5pt,yunit=.51pt,runit=1pt}
begin{pspicture}(800,1000)
{newrgbcolor{curcolor}{.8 .9 .8} % Box
pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]{
newpathmoveto(137,991)lineto(534,991)lineto(534,668)
lineto(137,668)closepath}}
{newrgbcolor{curcolor}{1 .2 1} % line
pscustom[linewidth=4,linecolor=curcolor]{
newpathmoveto(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]{
newpathmoveto(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]{
newpathmoveto(465,918)lineto(473,970)lineto(501,926)
curveto(489,931)(474,928)(465,918)closepath}}
end{pspicture}}
I left as exercise recreate the turbulence image in the same way. However, the equation of the image was typeset (inside Inkscape) using this LaTeX code:
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)
This is not an answer but an attempt to show that some type of vectorial art could be done without coding yourself as this could help to new users without a high LateX - tikz - maths training to produce high quality images.
The main point is that SVG files made with Inkscape, can be saved like pure TeX (PStricks) code and then used in a LaTeX document without loss of quality because are still a code to render a vectorial image. But sadly , the generated coded, said foo.tex, is not compilable as is, and will cryptically warning you:
%% Please note this file requires PSTricks extensions
What the hell mean that? Simply that you must make a LaTeX document with this two lines in the preamble::
usepackage[pdf]{pstricks} % "pdf" to use with `pdflatex`!
usepackage{pstricks-add}
And then in some part of your document (in a figure float, for instance) add:
input{foo}
The result:
The other option is save the vectorial image as PDF (or EPS), that can be used just like any PNG or JPG image with the usual includegraphics of the graphicx package. This have the advantage that can use some effects as color gradients or transparencies that are not well exported to PSTricks and also reduce the compilation time. Note that using PStricks you cannot use the PDF but the EPS images. However with an updated distribution you still can use pdflatex using the option [pdf] of pstricks package.
Full 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}
Note: The code of foo.texis too long to be posted and of scarce interest since is automatically generated from a manual draw. If you are curious about how is that code, is like this simple draw:
psset{xunit=.5pt,yunit=.51pt,runit=1pt}
begin{pspicture}(800,1000)
{newrgbcolor{curcolor}{.8 .9 .8} % Box
pscustom[linestyle=none,fillstyle=solid,fillcolor=curcolor]{
newpathmoveto(137,991)lineto(534,991)lineto(534,668)
lineto(137,668)closepath}}
{newrgbcolor{curcolor}{1 .2 1} % line
pscustom[linewidth=4,linecolor=curcolor]{
newpathmoveto(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]{
newpathmoveto(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]{
newpathmoveto(465,918)lineto(473,970)lineto(501,926)
curveto(489,931)(474,928)(465,918)closepath}}
end{pspicture}}
I left as exercise recreate the turbulence image in the same way. However, the equation of the image was typeset (inside Inkscape) using this LaTeX code:
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)
edited 2 days ago
answered 2 days ago
FranFran
53.6k6119183
53.6k6119183
1
Very nice! +1. Perhaps you could also add thatpotracehas the ability to convert an existing bitmap to a vector graphics format. The latter can be loaded in inkscape and then converted to svg, TikZ or PSTricks. This way you do not even have to draw the arcs in inkscape.
– marmot
2 days ago
1
@marmot Inkscape can also nicely vectorize bitmaps (and even show a preview according to the settings). These tools are really useful for complex shapes like human silhouettes, but objects like arrow tails are traced as shapes instead as single bezier curve, so any fix of control points in these closely parallel curves, including convert the shape it single line, is a pain. Instead, draw manually a single line with 3-4 controls points is a child play, and the line will be always of the same fixed width. So for this case I was the tracing tool. :)
– Fran
2 days ago
add a comment |
1
Very nice! +1. Perhaps you could also add thatpotracehas the ability to convert an existing bitmap to a vector graphics format. The latter can be loaded in inkscape and then converted to svg, TikZ or PSTricks. This way you do not even have to draw the arcs in inkscape.
– marmot
2 days ago
1
@marmot Inkscape can also nicely vectorize bitmaps (and even show a preview according to the settings). These tools are really useful for complex shapes like human silhouettes, but objects like arrow tails are traced as shapes instead as single bezier curve, so any fix of control points in these closely parallel curves, including convert the shape it single line, is a pain. Instead, draw manually a single line with 3-4 controls points is a child play, and the line will be always of the same fixed width. So for this case I was the tracing tool. :)
– Fran
2 days ago
1
1
Very nice! +1. Perhaps you could also add that
potrace has the ability to convert an existing bitmap to a vector graphics format. The latter can be loaded in inkscape and then converted to svg, TikZ or PSTricks. This way you do not even have to draw the arcs in inkscape.– marmot
2 days ago
Very nice! +1. Perhaps you could also add that
potrace has the ability to convert an existing bitmap to a vector graphics format. The latter can be loaded in inkscape and then converted to svg, TikZ or PSTricks. This way you do not even have to draw the arcs in inkscape.– marmot
2 days ago
1
1
@marmot Inkscape can also nicely vectorize bitmaps (and even show a preview according to the settings). These tools are really useful for complex shapes like human silhouettes, but objects like arrow tails are traced as shapes instead as single bezier curve, so any fix of control points in these closely parallel curves, including convert the shape it single line, is a pain. Instead, draw manually a single line with 3-4 controls points is a child play, and the line will be always of the same fixed width. So for this case I was the tracing tool. :)
– Fran
2 days ago
@marmot Inkscape can also nicely vectorize bitmaps (and even show a preview according to the settings). These tools are really useful for complex shapes like human silhouettes, but objects like arrow tails are traced as shapes instead as single bezier curve, so any fix of control points in these closely parallel curves, including convert the shape it single line, is a pain. Instead, draw manually a single line with 3-4 controls points is a child play, and the line will be always of the same fixed width. So for this case I was the tracing tool. :)
– Fran
2 days ago
add a comment |
Thanks for contributing an answer to TeX - LaTeX Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f482462%2ftikz-how-to-fill-area-with-a-special-pattern%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown


Here is a question on randomly curved arrows. It is not difficult to draw random arrows, but if I interpret your question correctly, they should not intersect. Avoiding intersections is probably more efforts. So I wish to clarify: you do not want the arrows to intersect?
– marmot
Mar 31 at 16:35
@marmot: Thanks for your comment - you are completely right! The arrows should not intersect, because the fluid can not cross in reality.
– Dave
Mar 31 at 16:48
1
As a proof of concept, I'm very interested in how this can be coded (+1 to mamot, indeed) but from a practical point of view (time and result quality) I would do it manually in Inkscape.
– Fran
Mar 31 at 18:09
@Fran: I took me the whole weekend to put and adjust some spirals into my
tikzpicture. Therefore I am curious if there is a better solution available for it.– Dave
Mar 31 at 18:12