1234567891011121314151617181920212223242526272829303132333435363738394041 |
- """Morphomatics example"""
- import numpy as np
- import vedo
- try:
- from morphomatics.geom import Surface
- from morphomatics.stats import StatisticalShapeModel
- from morphomatics.manifold import FundamentalCoords
- except ModuleNotFoundError:
- print("Install with:")
- print("pip install -U git+https://github.com/morphomatics/morphomatics.git#egg=morphomatics")
- exit(0)
- ln1 = [[1, 1, x / 2] for x in np.arange(0, 15, 0.2)]
- ln2 = [[np.sin(x), np.cos(x), x / 2] for x in np.arange(0,15, 0.2)]
- rads= [0.4*(np.cos(6*ir/len(ln2)))**2+0.2 for ir in range(len(ln2))]
- vmesh1 = vedo.Tube(ln1, r=0.08).triangulate().clean()
- vmesh2 = vedo.Tube(ln2, r=rads).triangulate().clean()
- verts1 = vmesh1.vertices
- verts2 = vmesh2.vertices
- faces = np.array(vmesh1.cells)
- # construct model
- SSM = StatisticalShapeModel(lambda ref: FundamentalCoords(ref))
- surfaces = [Surface(v, faces) for v in [verts1, verts2]]
- SSM.construct(surfaces)
- # sample trajectory along the main mode of variation
- shapes = []
- std = np.sqrt(SSM.variances[0])
- for t in np.linspace(-1.0, 1.0, 20):
- e = SSM.space.connec.exp(SSM.mean_coords, t * std * SSM.modes[0])
- v = SSM.space.from_coords(e)
- shapes.append(vedo.Mesh([v, faces]))
- plt = vedo.applications.Browser(shapes, slider_title="shape", bg2='blue9')
- plt.add(shapes[ 0].clone().on().wireframe().alpha(0.1).lighting('off'))
- plt.add(shapes[-1].clone().on().wireframe().alpha(0.1).lighting('off'))
- plt.show(viewup='z', axes=1).close()
|