measure_curvature1.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. """Calculate the surface curvature of an object
  2. by fitting a sphere to each vertex."""
  3. from vedo import printc, Ellipsoid, Plotter,fit_sphere
  4. import numpy as np
  5. msh = Ellipsoid()
  6. printc(__doc__, invert=1)
  7. plt = Plotter(N=4, axes=1)
  8. plt.at(0).show(msh, "Original shape")
  9. # Use built-in curvature method
  10. msh1 = msh.clone().compute_curvature(method=0)
  11. msh1.cmap('viridis').add_scalarbar()
  12. plt.at(1).show(msh1, "Gaussian curvature", azimuth=30, elevation=30)
  13. # Use sphere-fit curvature
  14. msh2 = msh.clone()
  15. # Set parameters and allocate arrays
  16. radius = 1.5
  17. curvature = np.zeros(msh2.npoints)
  18. residues = np.zeros(msh2.npoints)
  19. # iterate over surface points and fit sphere
  20. for idx in range(msh2.npoints):
  21. patch = msh2.closest_point(msh2.coordinates[idx], radius=radius)
  22. s = fit_sphere(patch)
  23. curvature[idx] = 1/(s.radius)**2
  24. residues[idx] = s.residue
  25. msh2.pointdata['Spherefit_Curvature'] = curvature
  26. msh2.pointdata['Spherefit_Curvature_Residue'] = residues
  27. msh2.cmap('viridis', 'Spherefit_Curvature')
  28. msh2.add_scalarbar()
  29. plt.at(2).show(msh2, "Sphere-fitted curvature")
  30. # Show fit residues
  31. msh3 = msh2.clone()
  32. msh3.cmap('jet', 'Spherefit_Curvature_Residue').add_scalarbar()
  33. plt.at(3).show(msh3, 'Sphere-fitted curvature\nFit residues')
  34. plt.interactive().close()