306_EigenDecomposition.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import sys, os
  2. # Add the igl library to the modules search path
  3. sys.path.insert(0, os.getcwd() + "/../")
  4. import pyigl as igl
  5. from shared import TUTORIAL_SHARED_PATH, check_dependencies
  6. dependencies = ["viewer"]
  7. check_dependencies(dependencies)
  8. V = igl.eigen.MatrixXd()
  9. U = igl.eigen.MatrixXd()
  10. F = igl.eigen.MatrixXi()
  11. c = 0
  12. bbd = 1.0
  13. twod = False
  14. if not igl.read_triangle_mesh(TUTORIAL_SHARED_PATH + "beetle.off", V, F):
  15. print("failed to load mesh")
  16. twod = V.col(2).minCoeff() == V.col(2).maxCoeff()
  17. bbd = (V.colwiseMaxCoeff() - V.colwiseMinCoeff()).norm()
  18. L = igl.eigen.SparseMatrixd()
  19. M = igl.eigen.SparseMatrixd()
  20. igl.cotmatrix(V, F, L)
  21. L = -L
  22. igl.massmatrix(V, F, igl.MASSMATRIX_TYPE_DEFAULT, M)
  23. k = 5
  24. D = igl.eigen.MatrixXd()
  25. if not igl.eigs(L, M, k + 1, igl.EIGS_TYPE_SM, U, D):
  26. print("Eigs failed.")
  27. U = (U - U.minCoeff()) / (U.maxCoeff() - U.minCoeff())
  28. viewer = igl.viewer.Viewer()
  29. def key_down(viewer, key, mod):
  30. global U, c
  31. if key == ord(' '):
  32. U = U.rightCols(k)
  33. # Rescale eigen vectors for visualization
  34. Z = bbd * 0.5 * U.col(c)
  35. C = igl.eigen.MatrixXd()
  36. igl.parula(U.col(c), False, C)
  37. c = (c + 1) % U.cols()
  38. if twod:
  39. V.setcol(2, Z)
  40. viewer.data.set_mesh(V, F)
  41. viewer.data.compute_normals()
  42. viewer.data.set_colors(C)
  43. return True
  44. viewer.callback_key_down = key_down
  45. viewer.callback_key_down(viewer, ord(' '), 0)
  46. viewer.core.show_lines = False
  47. viewer.launch()