Suavizando a região?

Sep 25 2020

Existe um Pi 2D

Eu consegui transformá-lo em 3D.

extrudeImage[image_] := 
  Block[{res, img}, 
  img = DeleteSmallComponents[Binarize[image, 0.9], 500];
  res = ImageMesh[img];
  RegionProduct[res, Line[{{0.}, {10.}}]]]

img = DeleteBorderComponents@
        ImageResize[Import["https://i.stack.imgur.com/AM0gC.png"], 100];
r = Region[extrudeImage@img, Axes -> True, 
        AxesLabel -> {"X", "Y", "Z"}];
r = TransformedRegion[r, TranslationTransform[-RegionCentroid@r]]

Tentei girá-lo para criar um Pi mais 3D, mas a superfície parecia muito áspera, o MMA não pode exportar o formato STL.

RegionUnion@
 Table[TransformedRegion[r, RotationTransform[i, {0, 1, 0}]], {i, 0, 
 Pi/3, Pi/10}]
Export["test.stl", %]

Como tornar a superfície lisa para que a impressora 3D possa ser usada?

Respostas

9 xzczd Sep 25 2020 at 19:25

Você precisa DiscretizeRegione RepairMesh:

r = Region[extrudeImage@img, Axes -> True, AxesLabel -> {"X", "Y", "Z"}];
r2 = TransformedRegion[r, TranslationTransform[-RegionCentroid@r]];

r3 = DiscretizeRegion@r2 // RepairMesh

rfinal = RegionUnion@
  Table[TransformedRegion[r3, RotationTransform[i, {0, 1, 0}]], 
        {i, 0, Pi/3, Pi/30}] // RepairMesh; // AbsoluteTiming
(* {117.008, Null} *)

Export["testfinal.stl", rfinal]

Atualizar

DiscretizeRegionacaba sendo desnecessário, porque a saída de extrudeImagejá é um MeshRegion, então só precisamos:

r = extrudeImage@img

r2 = TransformedRegion[r, TranslationTransform[-RegionCentroid@r]]

r3 = 
   RegionUnion@
    Table[TransformedRegion[r2 // RepairMesh, RotationTransform[i, {0, 1, 0}]], {i, 0, 
      Pi/3, Pi/75}]; // AbsoluteTiming
(* {0.296961, Null} *)

Export["test3.stl", r3]

Observe que o último RepairMeshtambém foi retirado, porque r3 == RepairMesh@r3acabou sendo True.