Generate randomly sized non-overlapping disks?
Just a quick modification of the code here,
distinctDisks[n_, range_:{0, 1}, radiusRange_:{0.03, 0.15}] := Module[
{d, f, p, r},
d = {Disk[RandomReal[range, 2], RandomReal[radiusRange]]};
Do[f = RegionDistance[RegionUnion @@ d];
While[
r = RandomReal[radiusRange];
p = RandomReal[range, 2];
f[p] < r];
d = Append[d, Disk[p, r]], {n - 1}];
d]
distinctDisks[25, {0, 5}, {0, 2}] // Graphics
Here's my take. It should work in earlier versions that do not yet have region-related functionality:
distinctDisks[n_Integer?Positive, {xmin_, xmax_}, {ymin_, ymax_}, {rmin_, rmax_}] :=
Module[{df = Max[0, EuclideanDistance[#1[[1]], #2[[1]]] - (#1[[2]] + #2[[2]])] &,
dlist = {}, k = 0, c, d, r},
While[c = RandomReal /@ {{xmin, xmax}, {ymin, ymax}};
r = RandomReal[{rmin, rmax}];
If[k == 0 || (Min[c[[1]] - xmin, xmax - c[[1]],
c[[2]] - ymin, ymax - c[[2]]] > r &&
df[First[Nearest[dlist, d = Disk[c, r],
DistanceFunction -> df]], d] > 0),
k++; AppendTo[dlist, d]]; k < n]; dlist]
An example:
BlockRandom[SeedRandom["many disks"]; (* for reproducibility *)
Graphics[Riffle[distinctDisks[150, {0, 5}, {0, 3}, {1/20, 3/2}],
Unevaluated[ColorData[61, RandomInteger[{1, 9}]]],
{1, -2, 2}], PlotRange -> {{0, 5}, {0, 3}}]]
I have to say, I have seen this question many times in SE, but it's difficult for me to find the duplicate post. Thus, I post my answer again:
disk = Reap[
region =
RegionUnion[
BoundaryDiscretizeGraphics[
CountryData[#, "Polygon"]] & /@ {"China", "Taiwan"}];
Do[p = RandomPoint[region];
rad = If[(tem = Abs[SignedRegionDistance[region, p]]) < .2, tem,
RandomReal[{.2,
Min[{tem, Min@(Subtract @@ RegionBounds@region)/40}]}]];
region =
RegionDifference[region, DiscretizeRegion@Sow[Disk[p, rad]]],
2500]][[-1, -1]]; Graphics[
Transpose[{RandomColor[
Hue[1/3, NormalDistribution[.6, .2], NormalDistribution[.6, .07]],
disk // Length], disk}]]
It is composed of 2500 disks. This low-efficiency code's main time is taken up by RegionDifference
. But you can produce any shape by changing region
.