I'm looking to randomly place an atom $\mathbf{A}$ onto a van der Waals surface formed by atoms $\mathbf{B}$, such that the distance between the randomly-generated atom $\mathbf{A}$ and the nearest surface atom $\mathbf{B}\_i$ is equal to the sum of the van der Waals radii $r$. Essentially, the problem boils down to a sphere rolling around on an uneven surface.

I can generate a van der Waals surface for graphene with the following code:

```
latticeGenerate[basisvec_List, numofcell_List, base_List] := 
 Module[{x, y, basex, basey}, {x, y} = 
   Transpose[Tuples[Range /@ numofcell].basisvec];
  {basex, basey} = Transpose[base];
  Transpose[{Join @@ ((x + #) & /@ basex), 
    Join @@ ((y + #) & /@ basey)}]]

```

Defining the C-C bond length and van der Waals radius,

```
a = 1.4145;
rc = 1.675;

carbonXYZ = Flatten[{#, 0}] & /@ 
   latticeGenerate[{{3 a, 0}, {0, Sqrt[3] a}}, {5,7}, 
      {{0, 0}, {a, 0}, {-a/2, Sqrt[3] a/2}, {3 a/2, Sqrt[3] a/2}}];

vdWsurf = Sphere[carbonXYZ, rc];
Graphics3D[{Gray, vdWsurf}, PlotRangePadding -> 2, Lighting -> "Neutral"]

```

I'd then like to place an atom with radius 2.5 at random on the top of this surface, e.g.

[![enter image description here](https://i.stack.imgur.com/Oo0zI.png)](https://i.stack.imgur.com/Oo0zI.png)

I did think about a naive approach using `FindInstance[]`, but this just runs for a long time without a result:

```
ra = 2.5;
minDist[pt_] := Min[Sqrt[(#.#)] & /@ (Transpose[Transpose[carbonXYZ] - pt])]
FindInstance[minDist[{x, y, z}] == (ra + rc) &&
                       5 < x < 15 && 5 < y < 15 && 0 < z < 5,
                       {x, y, z}, Reals]

```

Could the `Region[]` functionality of *Mathematica* be exploited here? I'm looking to generate lots of these systems, so speed is of the essence! Perhaps `RandomPoint[]` can be utilised in this case?