306_EigenDecomposition.py 1.3 KB

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