1

It can be considered as a sequel to 98724

I adopt the code of ybeltukov (thanks again) and I slightly modify it.

findPoints = 
  Compile[{{n, _Integer}, {low, _Real}, {high, _Real}, {minD, _Real}},
    Block[{data = RandomReal[{low, high}, {1, 2}], k = 1, rv, temp}, 
    While[k < n, rv = RandomReal[{low, high}, 2];
     temp = Transpose[Transpose[data] - rv];
     If[Min[Sqrt[(#.#)] & /@ temp] > minD, data = Join[data, {rv}];
      k++;];];
    data]];

npts = 150;
r = 0.03;
minD = 2.2 r;
low = 0;
high = 1;

SeedRandom[159]
pts = findPoints[npts, low, high, minD];
g2d = Graphics[{FaceForm@Lighter[Blue, 0.8], 
   EdgeForm@Directive[Thickness[0.004], Black], Disk[#, r] & /@ pts}, 
  PlotRange -> All, Background -> Lighter@Blue]

enter image description here

mask = BoundaryDiscretizeRegion[#, {{-1, 1}, {-1, 1}}, 
     MaxCellMeasure -> {1 -> .02}] &@
   BoundaryDiscretizeRegion[Disk[{0.5, 0.5}, {0.4, 0.5}]];
r2d = DiscretizeGraphics[g2d, MaxCellMeasure -> {1 -> .01}, 
   PlotRange -> All];
inside = RegionIntersection[r2d, mask]

enter image description here

edge = DiscretizeRegion@*Line@*Intersection @@ 
   Round[{Sort /@ 
      MeshPrimitives[RegionIntersection[r2d, mask], 1][[;; , 1]], 
     Sort /@ MeshPrimitives[RegionDifference[r2d, mask], 1][[;; , 
        1]]}, .0001];
points = DiscretizeRegion@*Point@*Intersection @@ 
   Round[{MeshPrimitives[RegionDifference[r2d, mask], 0][[;; , 1]], 
     MeshPrimitives[RegionDifference[mask, r2d], 0][[;; , 1]]}, .0001];

regionProduct[reg_, join_: True, y1_: 0, y2_: 1] := 
  Module[{n = MeshCellCount[reg, 0]}, 
   MeshRegion[
    Join @@ (ArrayFlatten@{{#[[;; , ;; 1]], #2, #[[;; , 2 ;;]]}} &[
         MeshCoordinates@reg, #] & /@ {y1, y2}), {MeshCells[reg, _], 
     MeshCells[reg, _] /. p : {__Integer} :> p + n, 
     If[join, 
      MeshCells[
        reg, _] /. {(Polygon | Line)[
          p_] :> (Polygon@Join[#, Reverse[#, 2] + n, 2] &@
           Partition[p, 2, 1, 1]), 
        Point[p_] :> Line@{p, p + n}}, ## &[]]}]];
mask3d = regionProduct@mask;
inside3d = regionProduct[inside, False];
edge3d = regionProduct@edge;
points3d = regionProduct@points;

toGC[reg_, dim_] := 
  GraphicsComplex[MeshCoordinates@reg, MeshCells[reg, dim]];

Graphics3D[{FaceForm@Lighter[Blue, 0.7], toGC[inside3d, 2], 
  EdgeForm[], toGC[edge3d, 2], toGC[points3d, 1], Lighter@Blue, 
  GeometricTransformation[toGC[mask3d, 2], 
   ScalingTransform[0.999 {1, 1, 1}, RegionCentroid@mask3d]]}, 
 Lighting -> "Neutral", Boxed -> False]

enter image description here

Graphics3D[{FaceForm@Lighter[Blue, 0.7], 
  toGC[regionProduct[RegionBoundary@inside, False], 1], EdgeForm[], 
  toGC[regionProduct@inside, 2], toGC[edge3d, 2], toGC[points3d, 1], 
  Blue, Opacity[0.11], 
  GeometricTransformation[toGC[mask3d, 2], 
   ScalingTransform[0.999 {1, 1, 1} #, RegionCentroid@mask3d] & /@ 
    Range[0, 1, 0.01]]}, Lighting -> "Neutral", Boxed -> False, 
 BaseStyle -> {RenderingOptions -> {"DepthPeelingLayers" -> 100}}]

enter image description here

My question is how I can get rid of the disks appeared "cut" and as the result the cylinders appeared also "cut"

enter image description here

Dimitris
  • 4,794
  • 22
  • 50

1 Answers1

4

The required modification is not too hard to do:

SeedRandom[159];
pts = Select[findPoints[npts, low, high, minD], 
             EuclideanDistance[#, {1, 1} (low + high)/2] < (low + high)/2 - r &];
g2d = Graphics[{FaceForm @ Lighter[Blue, 0.8],
                EdgeForm @ Directive[Thickness[0.004], Black],
                Disk[#, r] & /@ pts, Circle[{1/2, 1/2}, 1/2]},
               PlotRange -> All, Background -> Lighter @ Blue]

everything within the circle


The case where the confining region is an ellipse is a bit more complicated, since the parallel curve of an ellipse is complicated in general. Nevertheless,

ep = With[{a = 2/5, b = 1/2}, BoundaryDiscretizeRegion @
          ParametricRegion[(low + high) {1, 1}/2 + c ({a Cos[t], b Sin[t]} +
                           r Normalize[Cross[D[{a Cos[t], b Sin[t]}, t]]]),
                           {{c, 0, 1}, {t, 0, 2 π}}]];

SeedRandom[159];
pts = Select[findPoints[npts, low, high, minD], RegionMember[ep, #] &];
g2d = Graphics[{FaceForm @ Lighter[Blue, 0.8], 
                EdgeForm @ Directive[Thickness[0.004], Black],
                Disk[#, r] & /@ pts, Circle[{1/2, 1/2}, {2/5, 1/2}]},
               PlotRange -> All, Background -> Lighter @ Blue]

disks within an ellipse

J. M.'s missing motivation
  • 124,525
  • 11
  • 401
  • 574