306_EigenDecomposition.py 1.2 KB

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