How to stop overlap between different circles randomly generated
up vote
5
down vote
favorite
This question is similar to this question tikz: Distribute evenly and randomly circles (which is also where I got some of the code for this TiKz picture) but is different. I wish to draw multiple circles that do not overlap but some of these circles are different. Currently this is my code:
documentclass{article}
usepackage{tikz}
usepackage[margin=0.5in]{geometry}
newcommand{fillrandomly}[5]{
xdefxlist{4}
xdefylist{4}
pgfmathsetmacrodiametersqr{(#3*2)^2}
foreach i in {1,...,#4}{
foreach k in {1,...,20}{
pgfmathsetmacrox{rnd*#1}
pgfmathsetmacroy{rnd*#2}
xdefcollision{0}
foreach element [count=i] in xlist{
pgfmathtruncatemacroj{i-1}
pgfmathsetmacrocheckdistancesqr{ ( ({xlist}[j]-(x))^2 + ({ylist}[j]-(y))^2 ) }
ifdimcheckdistancesqr pt<diametersqr pt
xdefcollision{1}
breakforeach
fi
}
ifnumcollision=0
xdefxlist{xlist,x}
xdefylist{ylist,y}
draw (x,y) circle [radius=#3] node[anchor=center] {#5};
breakforeach
fi
}
}
}
begin{document}
begin{figure}
begin{tikzpicture}
begin{scope}[xshift=0.2cm,yshift=0.2cm]
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated strong acid};
begin{scope}[xshift=5cm]
foreach X in {1,...,3}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute strong acid};
end{scope}
begin{scope}[xshift=10cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
fillrandomly{3.6}{3.8}{0.15}{8}{$-$}
fillrandomly{3.6}{3.8}{0.15}{8}{$+$}
end{scope}
foreach X in {1,...,8}
{
draw[fill=black!10] (2+1.8*rand,2+1.9*rand) circle (0.15);
}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated weak acid};
end{scope}
begin{scope}[xshift=15cm]
foreach X in {1,...,2}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw[fill=black!10] (2+1.8*rand,2+1.9*rand) circle (0.15);
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute weak acid};
end{scope}
draw[fill=black!10] (0,-1) circle (0.15) node[right=0.1cm] {Unionised};
draw (0,-1.5) circle (0.15) node[anchor=center] {$+$} node[right=0.1cm] {Positive Ion};
draw (0,-2) circle (0.15) node[anchor=center] {$-$} node[right=0.1cm] {Negative Ion};
end{tikzpicture}
vspace{-2cm}
caption{Concentrated and dilute solutions of weak and strong acids}
end{figure}
end{document}
Which produces this image:
I am unsure how to stop overlapping between the three different types of circles especially in the first and third beaker counting from the left. XeLaTeX answer please
tikz-pgf
add a comment |
up vote
5
down vote
favorite
This question is similar to this question tikz: Distribute evenly and randomly circles (which is also where I got some of the code for this TiKz picture) but is different. I wish to draw multiple circles that do not overlap but some of these circles are different. Currently this is my code:
documentclass{article}
usepackage{tikz}
usepackage[margin=0.5in]{geometry}
newcommand{fillrandomly}[5]{
xdefxlist{4}
xdefylist{4}
pgfmathsetmacrodiametersqr{(#3*2)^2}
foreach i in {1,...,#4}{
foreach k in {1,...,20}{
pgfmathsetmacrox{rnd*#1}
pgfmathsetmacroy{rnd*#2}
xdefcollision{0}
foreach element [count=i] in xlist{
pgfmathtruncatemacroj{i-1}
pgfmathsetmacrocheckdistancesqr{ ( ({xlist}[j]-(x))^2 + ({ylist}[j]-(y))^2 ) }
ifdimcheckdistancesqr pt<diametersqr pt
xdefcollision{1}
breakforeach
fi
}
ifnumcollision=0
xdefxlist{xlist,x}
xdefylist{ylist,y}
draw (x,y) circle [radius=#3] node[anchor=center] {#5};
breakforeach
fi
}
}
}
begin{document}
begin{figure}
begin{tikzpicture}
begin{scope}[xshift=0.2cm,yshift=0.2cm]
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated strong acid};
begin{scope}[xshift=5cm]
foreach X in {1,...,3}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute strong acid};
end{scope}
begin{scope}[xshift=10cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
fillrandomly{3.6}{3.8}{0.15}{8}{$-$}
fillrandomly{3.6}{3.8}{0.15}{8}{$+$}
end{scope}
foreach X in {1,...,8}
{
draw[fill=black!10] (2+1.8*rand,2+1.9*rand) circle (0.15);
}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated weak acid};
end{scope}
begin{scope}[xshift=15cm]
foreach X in {1,...,2}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw[fill=black!10] (2+1.8*rand,2+1.9*rand) circle (0.15);
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute weak acid};
end{scope}
draw[fill=black!10] (0,-1) circle (0.15) node[right=0.1cm] {Unionised};
draw (0,-1.5) circle (0.15) node[anchor=center] {$+$} node[right=0.1cm] {Positive Ion};
draw (0,-2) circle (0.15) node[anchor=center] {$-$} node[right=0.1cm] {Negative Ion};
end{tikzpicture}
vspace{-2cm}
caption{Concentrated and dilute solutions of weak and strong acids}
end{figure}
end{document}
Which produces this image:
I am unsure how to stop overlapping between the three different types of circles especially in the first and third beaker counting from the left. XeLaTeX answer please
tikz-pgf
Lualatex ok?...
– JPi
2 hours ago
Sorry I prefer XeLaTeX, forgot to mention
– sab hoque
2 hours ago
add a comment |
up vote
5
down vote
favorite
up vote
5
down vote
favorite
This question is similar to this question tikz: Distribute evenly and randomly circles (which is also where I got some of the code for this TiKz picture) but is different. I wish to draw multiple circles that do not overlap but some of these circles are different. Currently this is my code:
documentclass{article}
usepackage{tikz}
usepackage[margin=0.5in]{geometry}
newcommand{fillrandomly}[5]{
xdefxlist{4}
xdefylist{4}
pgfmathsetmacrodiametersqr{(#3*2)^2}
foreach i in {1,...,#4}{
foreach k in {1,...,20}{
pgfmathsetmacrox{rnd*#1}
pgfmathsetmacroy{rnd*#2}
xdefcollision{0}
foreach element [count=i] in xlist{
pgfmathtruncatemacroj{i-1}
pgfmathsetmacrocheckdistancesqr{ ( ({xlist}[j]-(x))^2 + ({ylist}[j]-(y))^2 ) }
ifdimcheckdistancesqr pt<diametersqr pt
xdefcollision{1}
breakforeach
fi
}
ifnumcollision=0
xdefxlist{xlist,x}
xdefylist{ylist,y}
draw (x,y) circle [radius=#3] node[anchor=center] {#5};
breakforeach
fi
}
}
}
begin{document}
begin{figure}
begin{tikzpicture}
begin{scope}[xshift=0.2cm,yshift=0.2cm]
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated strong acid};
begin{scope}[xshift=5cm]
foreach X in {1,...,3}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute strong acid};
end{scope}
begin{scope}[xshift=10cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
fillrandomly{3.6}{3.8}{0.15}{8}{$-$}
fillrandomly{3.6}{3.8}{0.15}{8}{$+$}
end{scope}
foreach X in {1,...,8}
{
draw[fill=black!10] (2+1.8*rand,2+1.9*rand) circle (0.15);
}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated weak acid};
end{scope}
begin{scope}[xshift=15cm]
foreach X in {1,...,2}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw[fill=black!10] (2+1.8*rand,2+1.9*rand) circle (0.15);
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute weak acid};
end{scope}
draw[fill=black!10] (0,-1) circle (0.15) node[right=0.1cm] {Unionised};
draw (0,-1.5) circle (0.15) node[anchor=center] {$+$} node[right=0.1cm] {Positive Ion};
draw (0,-2) circle (0.15) node[anchor=center] {$-$} node[right=0.1cm] {Negative Ion};
end{tikzpicture}
vspace{-2cm}
caption{Concentrated and dilute solutions of weak and strong acids}
end{figure}
end{document}
Which produces this image:
I am unsure how to stop overlapping between the three different types of circles especially in the first and third beaker counting from the left. XeLaTeX answer please
tikz-pgf
This question is similar to this question tikz: Distribute evenly and randomly circles (which is also where I got some of the code for this TiKz picture) but is different. I wish to draw multiple circles that do not overlap but some of these circles are different. Currently this is my code:
documentclass{article}
usepackage{tikz}
usepackage[margin=0.5in]{geometry}
newcommand{fillrandomly}[5]{
xdefxlist{4}
xdefylist{4}
pgfmathsetmacrodiametersqr{(#3*2)^2}
foreach i in {1,...,#4}{
foreach k in {1,...,20}{
pgfmathsetmacrox{rnd*#1}
pgfmathsetmacroy{rnd*#2}
xdefcollision{0}
foreach element [count=i] in xlist{
pgfmathtruncatemacroj{i-1}
pgfmathsetmacrocheckdistancesqr{ ( ({xlist}[j]-(x))^2 + ({ylist}[j]-(y))^2 ) }
ifdimcheckdistancesqr pt<diametersqr pt
xdefcollision{1}
breakforeach
fi
}
ifnumcollision=0
xdefxlist{xlist,x}
xdefylist{ylist,y}
draw (x,y) circle [radius=#3] node[anchor=center] {#5};
breakforeach
fi
}
}
}
begin{document}
begin{figure}
begin{tikzpicture}
begin{scope}[xshift=0.2cm,yshift=0.2cm]
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated strong acid};
begin{scope}[xshift=5cm]
foreach X in {1,...,3}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute strong acid};
end{scope}
begin{scope}[xshift=10cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
fillrandomly{3.6}{3.8}{0.15}{8}{$-$}
fillrandomly{3.6}{3.8}{0.15}{8}{$+$}
end{scope}
foreach X in {1,...,8}
{
draw[fill=black!10] (2+1.8*rand,2+1.9*rand) circle (0.15);
}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated weak acid};
end{scope}
begin{scope}[xshift=15cm]
foreach X in {1,...,2}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw[fill=black!10] (2+1.8*rand,2+1.9*rand) circle (0.15);
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute weak acid};
end{scope}
draw[fill=black!10] (0,-1) circle (0.15) node[right=0.1cm] {Unionised};
draw (0,-1.5) circle (0.15) node[anchor=center] {$+$} node[right=0.1cm] {Positive Ion};
draw (0,-2) circle (0.15) node[anchor=center] {$-$} node[right=0.1cm] {Negative Ion};
end{tikzpicture}
vspace{-2cm}
caption{Concentrated and dilute solutions of weak and strong acids}
end{figure}
end{document}
Which produces this image:
I am unsure how to stop overlapping between the three different types of circles especially in the first and third beaker counting from the left. XeLaTeX answer please
tikz-pgf
tikz-pgf
edited 2 hours ago
asked 2 hours ago
sab hoque
1,250318
1,250318
Lualatex ok?...
– JPi
2 hours ago
Sorry I prefer XeLaTeX, forgot to mention
– sab hoque
2 hours ago
add a comment |
Lualatex ok?...
– JPi
2 hours ago
Sorry I prefer XeLaTeX, forgot to mention
– sab hoque
2 hours ago
Lualatex ok?...
– JPi
2 hours ago
Lualatex ok?...
– JPi
2 hours ago
Sorry I prefer XeLaTeX, forgot to mention
– sab hoque
2 hours ago
Sorry I prefer XeLaTeX, forgot to mention
– sab hoque
2 hours ago
add a comment |
1 Answer
1
active
oldest
votes
up vote
4
down vote
accepted
It is clear why this happens: you draw two or more independent samples, so if you say e.g.
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
the + ions do not know about the - ones. But it is very simple to fix it. Just make the reset of the collision list not part of the fillrandomly
, but do it whenever you start a new group. That is, I redefined fillrandomly
such that it does not reset the collision list, and added a command resetlists
that issues the reset. I also defined an ion
style that gets changed along the way such that one can add the filled ions.
documentclass{article}
usepackage{tikz}
usepackage[margin=0.5in]{geometry}
newcommand{resetlists}{xdefxlist{4}xdefylist{4}}
newcommand{fillrandomly}[5]{
pgfmathsetmacrodiametersqr{(#3*2)^2}
foreach i in {1,...,#4}{
foreach k in {1,...,20}{
pgfmathsetmacrox{rnd*#1}
pgfmathsetmacroy{rnd*#2}
xdefcollision{0}
foreach element [count=i] in xlist{
pgfmathtruncatemacroj{i-1}
pgfmathsetmacrocheckdistancesqr{ ( ({xlist}[j]-(x))^2 + ({ylist}[j]-(y))^2 ) }
ifdimcheckdistancesqr pt<diametersqr pt
xdefcollision{1}
breakforeach
fi
}
ifnumcollision=0
xdefxlist{xlist,x}
xdefylist{ylist,y}
draw[ion] (x,y) circle [radius=#3] node[anchor=center] {#5};
breakforeach
fi
}
}
}
begin{document}
begin{figure}
begin{tikzpicture}
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated strong acid};
% 2
begin{scope}[xshift=5cm]
foreach X in {1,...,3}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute strong acid};
end{scope}
% 3
begin{scope}[xshift=10cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{8}{$-$}
fillrandomly{3.6}{3.8}{0.15}{8}{$+$}
tikzset{ion/.style={fill=black!10}}
fillrandomly{3.6}{3.8}{0.15}{8}{}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated weak acid};
end{scope}
%4
begin{scope}[xshift=15cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{2}{$-$}
fillrandomly{3.6}{3.8}{0.15}{2}{$+$}
tikzset{ion/.style={fill=black!10}}
fillrandomly{3.6}{3.8}{0.15}{1}{}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute weak acid};
end{scope}
draw[fill=black!10] (0,-1) circle (0.15) node[right=0.1cm] {Unionised};
draw (0,-1.5) circle (0.15) node[anchor=center] {$+$} node[right=0.1cm] {Positive Ion};
draw (0,-2) circle (0.15) node[anchor=center] {$-$} node[right=0.1cm] {Negative Ion};
end{tikzpicture}
vspace{-2cm}
caption{Concentrated and dilute solutions of weak and strong acids}
end{figure}
end{document}
I may have misunderstood something, but is the only thing that was changed was the addition of an ion style. I can't see where the cahnge was made to prevent the resetting of the list? I like to understand the code before I use it
– sab hoque
56 mins ago
2
@sabhoque No, the original code hasxdefxlist{4}xdefylist{4}
part offillrandomly
. This resets the collision list, i.e. the list of previous positions of ions. Whenever a new ion is placed,fillrandomly
checks if the would-be ion overlaps with one of the previous ones. If not, the ion is drawn. All I did was not to reset the list automatically. So in the first example the+
ions also know where the-
ions were. I only reset the list when I switch to the next container. Theion
style allows you to draw the shaded circles withfillrandomly
, too.
– marmot
51 mins 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',
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%2f466069%2fhow-to-stop-overlap-between-different-circles-randomly-generated%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
4
down vote
accepted
It is clear why this happens: you draw two or more independent samples, so if you say e.g.
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
the + ions do not know about the - ones. But it is very simple to fix it. Just make the reset of the collision list not part of the fillrandomly
, but do it whenever you start a new group. That is, I redefined fillrandomly
such that it does not reset the collision list, and added a command resetlists
that issues the reset. I also defined an ion
style that gets changed along the way such that one can add the filled ions.
documentclass{article}
usepackage{tikz}
usepackage[margin=0.5in]{geometry}
newcommand{resetlists}{xdefxlist{4}xdefylist{4}}
newcommand{fillrandomly}[5]{
pgfmathsetmacrodiametersqr{(#3*2)^2}
foreach i in {1,...,#4}{
foreach k in {1,...,20}{
pgfmathsetmacrox{rnd*#1}
pgfmathsetmacroy{rnd*#2}
xdefcollision{0}
foreach element [count=i] in xlist{
pgfmathtruncatemacroj{i-1}
pgfmathsetmacrocheckdistancesqr{ ( ({xlist}[j]-(x))^2 + ({ylist}[j]-(y))^2 ) }
ifdimcheckdistancesqr pt<diametersqr pt
xdefcollision{1}
breakforeach
fi
}
ifnumcollision=0
xdefxlist{xlist,x}
xdefylist{ylist,y}
draw[ion] (x,y) circle [radius=#3] node[anchor=center] {#5};
breakforeach
fi
}
}
}
begin{document}
begin{figure}
begin{tikzpicture}
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated strong acid};
% 2
begin{scope}[xshift=5cm]
foreach X in {1,...,3}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute strong acid};
end{scope}
% 3
begin{scope}[xshift=10cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{8}{$-$}
fillrandomly{3.6}{3.8}{0.15}{8}{$+$}
tikzset{ion/.style={fill=black!10}}
fillrandomly{3.6}{3.8}{0.15}{8}{}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated weak acid};
end{scope}
%4
begin{scope}[xshift=15cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{2}{$-$}
fillrandomly{3.6}{3.8}{0.15}{2}{$+$}
tikzset{ion/.style={fill=black!10}}
fillrandomly{3.6}{3.8}{0.15}{1}{}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute weak acid};
end{scope}
draw[fill=black!10] (0,-1) circle (0.15) node[right=0.1cm] {Unionised};
draw (0,-1.5) circle (0.15) node[anchor=center] {$+$} node[right=0.1cm] {Positive Ion};
draw (0,-2) circle (0.15) node[anchor=center] {$-$} node[right=0.1cm] {Negative Ion};
end{tikzpicture}
vspace{-2cm}
caption{Concentrated and dilute solutions of weak and strong acids}
end{figure}
end{document}
I may have misunderstood something, but is the only thing that was changed was the addition of an ion style. I can't see where the cahnge was made to prevent the resetting of the list? I like to understand the code before I use it
– sab hoque
56 mins ago
2
@sabhoque No, the original code hasxdefxlist{4}xdefylist{4}
part offillrandomly
. This resets the collision list, i.e. the list of previous positions of ions. Whenever a new ion is placed,fillrandomly
checks if the would-be ion overlaps with one of the previous ones. If not, the ion is drawn. All I did was not to reset the list automatically. So in the first example the+
ions also know where the-
ions were. I only reset the list when I switch to the next container. Theion
style allows you to draw the shaded circles withfillrandomly
, too.
– marmot
51 mins ago
add a comment |
up vote
4
down vote
accepted
It is clear why this happens: you draw two or more independent samples, so if you say e.g.
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
the + ions do not know about the - ones. But it is very simple to fix it. Just make the reset of the collision list not part of the fillrandomly
, but do it whenever you start a new group. That is, I redefined fillrandomly
such that it does not reset the collision list, and added a command resetlists
that issues the reset. I also defined an ion
style that gets changed along the way such that one can add the filled ions.
documentclass{article}
usepackage{tikz}
usepackage[margin=0.5in]{geometry}
newcommand{resetlists}{xdefxlist{4}xdefylist{4}}
newcommand{fillrandomly}[5]{
pgfmathsetmacrodiametersqr{(#3*2)^2}
foreach i in {1,...,#4}{
foreach k in {1,...,20}{
pgfmathsetmacrox{rnd*#1}
pgfmathsetmacroy{rnd*#2}
xdefcollision{0}
foreach element [count=i] in xlist{
pgfmathtruncatemacroj{i-1}
pgfmathsetmacrocheckdistancesqr{ ( ({xlist}[j]-(x))^2 + ({ylist}[j]-(y))^2 ) }
ifdimcheckdistancesqr pt<diametersqr pt
xdefcollision{1}
breakforeach
fi
}
ifnumcollision=0
xdefxlist{xlist,x}
xdefylist{ylist,y}
draw[ion] (x,y) circle [radius=#3] node[anchor=center] {#5};
breakforeach
fi
}
}
}
begin{document}
begin{figure}
begin{tikzpicture}
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated strong acid};
% 2
begin{scope}[xshift=5cm]
foreach X in {1,...,3}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute strong acid};
end{scope}
% 3
begin{scope}[xshift=10cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{8}{$-$}
fillrandomly{3.6}{3.8}{0.15}{8}{$+$}
tikzset{ion/.style={fill=black!10}}
fillrandomly{3.6}{3.8}{0.15}{8}{}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated weak acid};
end{scope}
%4
begin{scope}[xshift=15cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{2}{$-$}
fillrandomly{3.6}{3.8}{0.15}{2}{$+$}
tikzset{ion/.style={fill=black!10}}
fillrandomly{3.6}{3.8}{0.15}{1}{}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute weak acid};
end{scope}
draw[fill=black!10] (0,-1) circle (0.15) node[right=0.1cm] {Unionised};
draw (0,-1.5) circle (0.15) node[anchor=center] {$+$} node[right=0.1cm] {Positive Ion};
draw (0,-2) circle (0.15) node[anchor=center] {$-$} node[right=0.1cm] {Negative Ion};
end{tikzpicture}
vspace{-2cm}
caption{Concentrated and dilute solutions of weak and strong acids}
end{figure}
end{document}
I may have misunderstood something, but is the only thing that was changed was the addition of an ion style. I can't see where the cahnge was made to prevent the resetting of the list? I like to understand the code before I use it
– sab hoque
56 mins ago
2
@sabhoque No, the original code hasxdefxlist{4}xdefylist{4}
part offillrandomly
. This resets the collision list, i.e. the list of previous positions of ions. Whenever a new ion is placed,fillrandomly
checks if the would-be ion overlaps with one of the previous ones. If not, the ion is drawn. All I did was not to reset the list automatically. So in the first example the+
ions also know where the-
ions were. I only reset the list when I switch to the next container. Theion
style allows you to draw the shaded circles withfillrandomly
, too.
– marmot
51 mins ago
add a comment |
up vote
4
down vote
accepted
up vote
4
down vote
accepted
It is clear why this happens: you draw two or more independent samples, so if you say e.g.
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
the + ions do not know about the - ones. But it is very simple to fix it. Just make the reset of the collision list not part of the fillrandomly
, but do it whenever you start a new group. That is, I redefined fillrandomly
such that it does not reset the collision list, and added a command resetlists
that issues the reset. I also defined an ion
style that gets changed along the way such that one can add the filled ions.
documentclass{article}
usepackage{tikz}
usepackage[margin=0.5in]{geometry}
newcommand{resetlists}{xdefxlist{4}xdefylist{4}}
newcommand{fillrandomly}[5]{
pgfmathsetmacrodiametersqr{(#3*2)^2}
foreach i in {1,...,#4}{
foreach k in {1,...,20}{
pgfmathsetmacrox{rnd*#1}
pgfmathsetmacroy{rnd*#2}
xdefcollision{0}
foreach element [count=i] in xlist{
pgfmathtruncatemacroj{i-1}
pgfmathsetmacrocheckdistancesqr{ ( ({xlist}[j]-(x))^2 + ({ylist}[j]-(y))^2 ) }
ifdimcheckdistancesqr pt<diametersqr pt
xdefcollision{1}
breakforeach
fi
}
ifnumcollision=0
xdefxlist{xlist,x}
xdefylist{ylist,y}
draw[ion] (x,y) circle [radius=#3] node[anchor=center] {#5};
breakforeach
fi
}
}
}
begin{document}
begin{figure}
begin{tikzpicture}
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated strong acid};
% 2
begin{scope}[xshift=5cm]
foreach X in {1,...,3}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute strong acid};
end{scope}
% 3
begin{scope}[xshift=10cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{8}{$-$}
fillrandomly{3.6}{3.8}{0.15}{8}{$+$}
tikzset{ion/.style={fill=black!10}}
fillrandomly{3.6}{3.8}{0.15}{8}{}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated weak acid};
end{scope}
%4
begin{scope}[xshift=15cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{2}{$-$}
fillrandomly{3.6}{3.8}{0.15}{2}{$+$}
tikzset{ion/.style={fill=black!10}}
fillrandomly{3.6}{3.8}{0.15}{1}{}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute weak acid};
end{scope}
draw[fill=black!10] (0,-1) circle (0.15) node[right=0.1cm] {Unionised};
draw (0,-1.5) circle (0.15) node[anchor=center] {$+$} node[right=0.1cm] {Positive Ion};
draw (0,-2) circle (0.15) node[anchor=center] {$-$} node[right=0.1cm] {Negative Ion};
end{tikzpicture}
vspace{-2cm}
caption{Concentrated and dilute solutions of weak and strong acids}
end{figure}
end{document}
It is clear why this happens: you draw two or more independent samples, so if you say e.g.
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
the + ions do not know about the - ones. But it is very simple to fix it. Just make the reset of the collision list not part of the fillrandomly
, but do it whenever you start a new group. That is, I redefined fillrandomly
such that it does not reset the collision list, and added a command resetlists
that issues the reset. I also defined an ion
style that gets changed along the way such that one can add the filled ions.
documentclass{article}
usepackage{tikz}
usepackage[margin=0.5in]{geometry}
newcommand{resetlists}{xdefxlist{4}xdefylist{4}}
newcommand{fillrandomly}[5]{
pgfmathsetmacrodiametersqr{(#3*2)^2}
foreach i in {1,...,#4}{
foreach k in {1,...,20}{
pgfmathsetmacrox{rnd*#1}
pgfmathsetmacroy{rnd*#2}
xdefcollision{0}
foreach element [count=i] in xlist{
pgfmathtruncatemacroj{i-1}
pgfmathsetmacrocheckdistancesqr{ ( ({xlist}[j]-(x))^2 + ({ylist}[j]-(y))^2 ) }
ifdimcheckdistancesqr pt<diametersqr pt
xdefcollision{1}
breakforeach
fi
}
ifnumcollision=0
xdefxlist{xlist,x}
xdefylist{ylist,y}
draw[ion] (x,y) circle [radius=#3] node[anchor=center] {#5};
breakforeach
fi
}
}
}
begin{document}
begin{figure}
begin{tikzpicture}
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{12}{$-$}
fillrandomly{3.6}{3.8}{0.15}{12}{$+$}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated strong acid};
% 2
begin{scope}[xshift=5cm]
foreach X in {1,...,3}
{draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$+$};
draw (2+1.8*rand,2+1.9*rand) circle (0.15) node[anchor=center] {$-$};}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute strong acid};
end{scope}
% 3
begin{scope}[xshift=10cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{8}{$-$}
fillrandomly{3.6}{3.8}{0.15}{8}{$+$}
tikzset{ion/.style={fill=black!10}}
fillrandomly{3.6}{3.8}{0.15}{8}{}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {concentrated weak acid};
end{scope}
%4
begin{scope}[xshift=15cm]
begin{scope}[xshift=0.2cm,yshift=0.2cm]
resetlists
tikzset{ion/.style={}}
fillrandomly{3.6}{3.8}{0.15}{2}{$-$}
fillrandomly{3.6}{3.8}{0.15}{2}{$+$}
tikzset{ion/.style={fill=black!10}}
fillrandomly{3.6}{3.8}{0.15}{1}{}
end{scope}
draw (0,5) -- (0,1);
draw (0,1) .. controls (0,0) and (0,0) .. (1,0);
draw (1,0) -- (3,0);
draw (3,0) .. controls (4,0) and (4,0) .. (4,1);
draw (4,1) -- (4,5);
draw[densely dashed] (0,5) .. controls (0,4.5) and (0,4.5) .. (0.5,4.5);
draw[densely dashed] (0.5,4.5) -- (3.5,4.5);
draw[densely dashed] (3.5,4.5) .. controls (4,4.5) and (4,4.5) .. (4,5);
node[anchor=center] at (2,-0.5) {dilute weak acid};
end{scope}
draw[fill=black!10] (0,-1) circle (0.15) node[right=0.1cm] {Unionised};
draw (0,-1.5) circle (0.15) node[anchor=center] {$+$} node[right=0.1cm] {Positive Ion};
draw (0,-2) circle (0.15) node[anchor=center] {$-$} node[right=0.1cm] {Negative Ion};
end{tikzpicture}
vspace{-2cm}
caption{Concentrated and dilute solutions of weak and strong acids}
end{figure}
end{document}
answered 1 hour ago
marmot
83.5k493178
83.5k493178
I may have misunderstood something, but is the only thing that was changed was the addition of an ion style. I can't see where the cahnge was made to prevent the resetting of the list? I like to understand the code before I use it
– sab hoque
56 mins ago
2
@sabhoque No, the original code hasxdefxlist{4}xdefylist{4}
part offillrandomly
. This resets the collision list, i.e. the list of previous positions of ions. Whenever a new ion is placed,fillrandomly
checks if the would-be ion overlaps with one of the previous ones. If not, the ion is drawn. All I did was not to reset the list automatically. So in the first example the+
ions also know where the-
ions were. I only reset the list when I switch to the next container. Theion
style allows you to draw the shaded circles withfillrandomly
, too.
– marmot
51 mins ago
add a comment |
I may have misunderstood something, but is the only thing that was changed was the addition of an ion style. I can't see where the cahnge was made to prevent the resetting of the list? I like to understand the code before I use it
– sab hoque
56 mins ago
2
@sabhoque No, the original code hasxdefxlist{4}xdefylist{4}
part offillrandomly
. This resets the collision list, i.e. the list of previous positions of ions. Whenever a new ion is placed,fillrandomly
checks if the would-be ion overlaps with one of the previous ones. If not, the ion is drawn. All I did was not to reset the list automatically. So in the first example the+
ions also know where the-
ions were. I only reset the list when I switch to the next container. Theion
style allows you to draw the shaded circles withfillrandomly
, too.
– marmot
51 mins ago
I may have misunderstood something, but is the only thing that was changed was the addition of an ion style. I can't see where the cahnge was made to prevent the resetting of the list? I like to understand the code before I use it
– sab hoque
56 mins ago
I may have misunderstood something, but is the only thing that was changed was the addition of an ion style. I can't see where the cahnge was made to prevent the resetting of the list? I like to understand the code before I use it
– sab hoque
56 mins ago
2
2
@sabhoque No, the original code has
xdefxlist{4}xdefylist{4}
part of fillrandomly
. This resets the collision list, i.e. the list of previous positions of ions. Whenever a new ion is placed, fillrandomly
checks if the would-be ion overlaps with one of the previous ones. If not, the ion is drawn. All I did was not to reset the list automatically. So in the first example the +
ions also know where the -
ions were. I only reset the list when I switch to the next container. The ion
style allows you to draw the shaded circles with fillrandomly
, too.– marmot
51 mins ago
@sabhoque No, the original code has
xdefxlist{4}xdefylist{4}
part of fillrandomly
. This resets the collision list, i.e. the list of previous positions of ions. Whenever a new ion is placed, fillrandomly
checks if the would-be ion overlaps with one of the previous ones. If not, the ion is drawn. All I did was not to reset the list automatically. So in the first example the +
ions also know where the -
ions were. I only reset the list when I switch to the next container. The ion
style allows you to draw the shaded circles with fillrandomly
, too.– marmot
51 mins 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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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%2f466069%2fhow-to-stop-overlap-between-different-circles-randomly-generated%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
Lualatex ok?...
– JPi
2 hours ago
Sorry I prefer XeLaTeX, forgot to mention
– sab hoque
2 hours ago