1234567891011121314151617181920212223242526272829303132333435363738 |
- """Segment a TetMesh with a custom scalar.
- Press q to make it explode"""
- from vedo import TetMesh, Plotter, Text2D, dataurl
- n = 20000
- f1 = 0.005 # control the tetras resolution
- f2 = 0.15 # control the nr of seeds
- tmesh = TetMesh(dataurl + "limb.vtu")
- surf = tmesh.tomesh(fill=False)
- txt = Text2D(__doc__, font="Brachium")
- # pick points on the surface and use subsample to make them uniform
- seeds = surf.clone().subsample(f2).ps(10).c("black")
- # assign to each tetrahedron the id of the closest seed point
- cids = []
- for p in tmesh.cell_centers().coordinates:
- cid = seeds.closest_point(p, return_point_id=True)
- cids.append(cid)
- tmesh.celldata["fragment"] = cids
- pieces = []
- for i in range(seeds.npoints):
- tc = tmesh.clone().threshold(name="fragment", above=i-0.1, below=i+0.1)
- mc = tc.tomesh(fill=False).color(i)
- pieces.append(mc)
- ############### animate
- plt = Plotter(size=(1200, 800), axes=1)
- plt.show(txt, pieces)
- for i in range(20):
- for pc in pieces:
- cm = pc.center_of_mass()
- pc.shift(cm / 25)
- txt.text(f"{__doc__}\n\nNr. of pieces = {seeds.npoints}")
- plt.render()
- plt.interactive().close()
|