Drawing stones and pebbles under seafloor
Another two options, first using \pgfdeclarepatternformonly
within tikzpicture environment to enable to use basic tikz code instructions like \draw
instead \pgfpath...
, the issue is that only accept paths, so filling with shades is not available; for this reason the second option is done using basic tikz code in drawing definitions to not repeat the code many times and creating another definition like a pattern
helped with clip
and foreach
statement.
RESULT:
MWE:
\documentclass[tikz,border=5pt]{standalone}
\usetikzlibrary{calc}
\usetikzlibrary{patterns,shapes.geometric,decorations.pathmorphing,decorations.pathreplacing}
\begin{document}
\begin{tikzpicture}[
myshade/.style={
black!50,
draw,
ultra thin,
rounded corners=.5mm,
top color=brown!20,
bottom color=brown!20!gray
},
interface/.style={
% The border decoration is a path replacing decorator.
% For the interface style we want to draw the original path.
% The postaction option is therefore used to ensure that the
% border decoration is drawn *after* the original path.
postaction={draw,decorate,decoration={border,angle=-135,
amplitude=0.3cm,segment length=2mm}}
}
]
\def\stone(#1)[#2][#3]{%Drawing manually some shape
\begin{scope}[shift={(#1)},rotate=#2,scale=#3,transform shape]
\draw[line width=0.25pt,rounded corners=1pt]
(15:3pt) -- (45:4pt) -- (89:5pt)--(135:6pt) -- (150:3pt) -- (182:4pt)--(235:6pt) -- (280:3pt) -- (330:2pt) -- cycle;
\end{scope}
}
%Declare a new pattern ¿form only?
\pgfdeclarepatternformonly{pebless under sea floor}{\pgfqpoint{0pt}{0pt}}{\pgfqpoint{15pt}{15pt}}{\pgfqpoint{15pt}{15pt}}%
{
\stone(8pt,6pt)[-15][1]
\stone(0pt,0pt)[45][0.7]
\stone(15pt,15pt)[45][0.7]
\stone(0pt,15pt)[45][0.7]
\stone(15pt,0pt)[45][0.7]
\stone(0pt,7.5pt)[180][0.7]
\stone(15pt,7.5pt)[180][0.7]
\stone(7.5pt,0pt)[90][0.7]
\stone(7.5pt,15pt)[90][0.7]
\draw[line width=0.25pt,rotate=-45] (5.5pt,10pt) ellipse (1pt and 2pt);
\draw[line width=0.25pt] (12pt,10pt) circle (0.7pt);
}
%Create a second shape to create a brute force pattern...
\def\stone2(#1)[#2][#3]{
\begin{scope}[shift={(#1)},rotate=#2,scale=#3,transform shape]
\draw[myshade]
(15:3pt) -- (45:4pt) -- (89:5pt)--(135:6pt) -- (150:3pt) -- (182:4pt)--(235:6pt) -- (280:3pt) -- (330:2pt) -- cycle;
\end{scope}
}
\def\stonepattern(#1){%Brute force pattern
\begin{scope}[shift={(#1)}]
\clip (0,0) rectangle ++(15pt,15pt);
\stone2(8pt,6pt)[-15][1]
\stone2(0pt,0pt)[45][0.7]
\stone2(15pt,15pt)[45][0.7]
\stone2(0pt,15pt)[45][0.7]
\stone2(15pt,0pt)[45][0.7]
\stone2(0pt,7.5pt)[180][0.7]
\stone2(15pt,7.5pt)[180][0.7]
\stone2(7.5pt,0pt)[90][0.7]
\stone2(7.5pt,15pt)[90][0.7]
\draw[line width=0.25pt,rotate=-45,myshade] (5.5pt,10pt) ellipse (1pt and 2pt);
\draw[line width=0.25pt,myshade] (12pt,10pt) circle (0.7pt);
\end{scope}
}
%Start drawing the thing
\clip[rounded corners=0.2cm] (0,2) rectangle ++(12,-3);
\fill [cyan!10] (0,0) rectangle ++(12,2);
\fill[fill=brown!25, rounded corners=1mm, opacity=0.5]
(0,0) rectangle ++(12,-1);
%Drawing sea floor using pattern
\fill[pattern=pebless under sea floor] (0,0) rectangle ++(6,-1);
%Dragind sea floor using brute force...
\begin{scope}
\clip(6,0) rectangle ++(6,-1);
\foreach \x in {0,...,11}{
\foreach \y in{0,...,2}{
\stonepattern(6cm+\x*15pt,-1cm+\y*15pt)
}
}
\end{scope}
\draw [thick, black,interface] (0,0)--(13,0);
\end{tikzpicture}
\end{document}
Conceptually the problem of drawing the stones is very similar to what has been done in this answer, which I am recycling here. This allows you to avoid overlaps.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{%
decorations.pathreplacing,%
decorations.pathmorphing%
}
\newcommand\irregularcircle[1]{% radius, irregularity
+(0:#1)
\foreach \a in {30,60,...,330}{
let \n1 = {(#1)+rand*(0.2*#1)} in
-- +(\a:\n1)
} -- cycle
}
%from https://tex.stackexchange.com/a/87518/121799
\def\xlist{4}
\def\ylist{4}
\newcommand{\fillrandomly}[7][]{
\pgfmathsetmacro\diameter{#6*2}
\foreach \i in {1,...,#7}{
\pgfmathsetmacro\x{0.5*(#4+#2+(2*rnd-1)*(#4-#2))}
\pgfmathsetmacro\y{0.5*(#5+#3+(2*rnd-1)*(#5-#3))}
\xdef\collision{0}
\foreach \element [count=\i] in \xlist{
\pgfmathtruncatemacro\j{\i-1}
\pgfmathsetmacro\checkdistance{ sqrt( ({\xlist}[\j]-(\x))^2 + ({\ylist}[\j]-(\y))^2 ) }
\ifdim\checkdistance pt<\diameter pt
\xdef\collision{1}
\breakforeach
\fi
}
\ifnum\collision=0
\xdef\xlist{\xlist,\x}
\xdef\ylist{\ylist,\y}
\draw[black!50,ultra thin,rounded corners=.5mm,
top color=brown!20,bottom color=brown!20!gray,
shading angle={(0.5+rand)*20}]
(\x,\y) \irregularcircle{0.21cm};
\fi
}
}
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}[
media/.style={font={\footnotesize\sffamily}},
wave/.style={
decorate,decoration={snake,post length=1.4mm,amplitude=2mm,
segment length=2mm},thick},
interface/.style={
% The border decoration is a path replacing decorator.
% For the interface style we want to draw the original path.
% The postaction option is therefore used to ensure that the
% border decoration is drawn *after* the original path.
postaction={draw,decorate,decoration={border,angle=-135,
amplitude=0.3cm,segment length=2mm}}
}
]
\begin{scope}
\draw [draw=none, fill=cyan!10, rounded corners=2mm] (-2,0) rectangle
(10,2);
\draw [interface, thick, black] (-2,0)--(10,0);
\draw[draw=none, fill=brown!10, rounded corners=1mm, opacity=0.5]
(-2,0)rectangle (10,-1);
\clip (-2,0) rectangle (10,-2);
\fillrandomly{-2+0.21}{-0.21}{10-0.21}{-1+0.21}{0.21}{37}
\end{scope}
\end{tikzpicture}
\end{document}
As for your second question: do you have a rough idea how the stones should look like? I made a proposal but it may be very different from what you're hoping to get.
It might be nicer to have the stones on the background.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{%
decorations.pathreplacing,%
decorations.pathmorphing
}
\newcommand\irregularcircle[1]{% radius, irregularity
+(0:#1)
\foreach \a in {30,60,...,330}{
let \n1 = {(#1)+rand*(0.2*#1)} in
-- +(\a:\n1)
} -- cycle
}
%from https://tex.stackexchange.com/a/87518/121799
\def\xlist{4}
\def\ylist{4}
\newcommand{\fillrandomly}[7][]{
\pgfmathsetmacro\diameter{#6*2}
\foreach \i in {1,...,#7}{
\pgfmathsetmacro\x{0.5*(#4+#2+(2*rnd-1)*(#4-#2))}
\pgfmathsetmacro\y{0.5*(#5+#3+(2*rnd-1)*(#5-#3))}
\xdef\collision{0}
\foreach \element [count=\i] in \xlist{
\pgfmathtruncatemacro\j{\i-1}
\pgfmathsetmacro\checkdistance{ sqrt( ({\xlist}[\j]-(\x))^2 + ({\ylist}[\j]-(\y))^2 ) }
\ifdim\checkdistance pt<\diameter pt
\xdef\collision{1}
\breakforeach
\fi
}
\ifnum\collision=0
\xdef\xlist{\xlist,\x}
\xdef\ylist{\ylist,\y}
\draw[black!50,ultra thin,rounded corners=.5mm,
top color=brown!20,bottom color=brown!20!gray,
shading angle={(0.5+rand)*20}]
(\x,\y) \irregularcircle{0.21cm};
\fi
}
}
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}[
media/.style={font={\footnotesize\sffamily}},
wave/.style={
decorate,decoration={snake,post length=1.4mm,amplitude=2mm,
segment length=2mm},thick},
interface/.style={
% The border decoration is a path replacing decorator.
% For the interface style we want to draw the original path.
% The postaction option is therefore used to ensure that the
% border decoration is drawn *after* the original path.
postaction={draw,decorate,decoration={border,angle=-135,
amplitude=0.3cm,segment length=2mm}}
}
]
\draw [draw=none, fill=cyan!10, rounded corners=2mm] (-2,0) rectangle
(10,2);
\begin{scope}
\clip (-2,0) rectangle (10,-2);
\draw[draw=none, fill=brown!10, rounded corners=1mm, opacity=0.5]
(-2,0)rectangle (10,-1);
\fillrandomly{-2+0.21}{-0.21}{10-0.21}{-1+0.21}{0.21}{37}
\draw [interface, thick, black] (-2,0)--(10,0);
\end{scope}
\end{tikzpicture}
\end{document}