discussion_978.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from skimage import measure
  2. from vedo import *
  3. settings.use_parallel_projection = True
  4. # Create Ellipsoid
  5. ellipsoid = Ellipsoid(axis1=(1,0,0), axis2=(0,2,0), axis3=(0,0,3))
  6. ellipsoid.rotate_z(45).rotate_x(20).pos(30,40,50)
  7. s = 0.1
  8. vol = ellipsoid.binarize(spacing=(s,s,s)).print()
  9. np_vol = vol.tonumpy()
  10. labels = measure.label(np_vol, connectivity=2)
  11. properties = measure.regionprops(labels)
  12. centroid = properties[0].centroid
  13. inertia_tensor = properties[0].inertia_tensor * 0.1
  14. eigenvalues, eigenvectors = np.linalg.eig(inertia_tensor)
  15. e0 = eigenvectors[:,0]*eigenvalues[0]
  16. e1 = eigenvectors[:,1]*eigenvalues[1]
  17. e2 = eigenvectors[:,2]*eigenvalues[2]
  18. # Construct Ellipsoid With Inertia Tensor
  19. transform = LinearTransform(inertia_tensor)
  20. transform.rotate(90, e1)
  21. transform.shift(centroid)
  22. tens = Sphere(res=24).apply_transform(transform)
  23. tens.color('w').alpha(0.25).lw(1)
  24. line0 = Line([0,0,0], [1,0,0]).apply_transform(transform).color('r').lw(4)
  25. line1 = Line([0,0,0], [0,1,0]).apply_transform(transform).color('g').lw(4)
  26. line2 = Line([0,0,0], [0,0,1]).apply_transform(transform).color('b').lw(4)
  27. evector0 = Arrow(end_pt=e0, c='r').rotate(90, e1).shift(centroid)
  28. evector1 = Arrow(end_pt=e1, c='g').rotate(90, e1).shift(centroid)
  29. evector2 = Arrow(end_pt=e2, c='b').rotate(90, e1).shift(centroid)
  30. # print("eigenvectors\n", eigenvectors)
  31. # print("eigenvalues ", eigenvalues)
  32. # print(transform)
  33. # print("inertia_tensor\n", inertia_tensor)
  34. show(
  35. ellipsoid.scale(10).pos(centroid).wireframe(), # should roughly match the tensor
  36. tens,
  37. line0, line1, line2, evector0, evector1, evector2,
  38. axes=1, bg2='lightblue', viewup='z',
  39. )