12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- from skimage import measure
- from vedo import *
- settings.use_parallel_projection = True
- # Create Ellipsoid
- ellipsoid = Ellipsoid(axis1=(1,0,0), axis2=(0,2,0), axis3=(0,0,3))
- ellipsoid.rotate_z(45).rotate_x(20).pos(30,40,50)
- s = 0.1
- vol = ellipsoid.binarize(spacing=(s,s,s)).print()
- np_vol = vol.tonumpy()
- labels = measure.label(np_vol, connectivity=2)
- properties = measure.regionprops(labels)
- centroid = properties[0].centroid
- inertia_tensor = properties[0].inertia_tensor * 0.1
- eigenvalues, eigenvectors = np.linalg.eig(inertia_tensor)
- e0 = eigenvectors[:,0]*eigenvalues[0]
- e1 = eigenvectors[:,1]*eigenvalues[1]
- e2 = eigenvectors[:,2]*eigenvalues[2]
- # Construct Ellipsoid With Inertia Tensor
- transform = LinearTransform(inertia_tensor)
- transform.rotate(90, e1)
- transform.shift(centroid)
- tens = Sphere(res=24).apply_transform(transform)
- tens.color('w').alpha(0.25).lw(1)
- line0 = Line([0,0,0], [1,0,0]).apply_transform(transform).color('r').lw(4)
- line1 = Line([0,0,0], [0,1,0]).apply_transform(transform).color('g').lw(4)
- line2 = Line([0,0,0], [0,0,1]).apply_transform(transform).color('b').lw(4)
- evector0 = Arrow(end_pt=e0, c='r').rotate(90, e1).shift(centroid)
- evector1 = Arrow(end_pt=e1, c='g').rotate(90, e1).shift(centroid)
- evector2 = Arrow(end_pt=e2, c='b').rotate(90, e1).shift(centroid)
- # print("eigenvectors\n", eigenvectors)
- # print("eigenvalues ", eigenvalues)
- # print(transform)
- # print("inertia_tensor\n", inertia_tensor)
- show(
- ellipsoid.scale(10).pos(centroid).wireframe(), # should roughly match the tensor
- tens,
- line0, line1, line2, evector0, evector1, evector2,
- axes=1, bg2='lightblue', viewup='z',
- )
|