306_EigenDecomposition.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # This file is part of libigl, a simple c++ geometry processing library.
  2. #
  3. # Copyright (C) 2017 Sebastian Koch <s.koch@tu-berlin.de> and Daniele Panozzo <daniele.panozzo@gmail.com>
  4. #
  5. # This Source Code Form is subject to the terms of the Mozilla Public License
  6. # v. 2.0. If a copy of the MPL was not distributed with this file, You can
  7. # obtain one at http://mozilla.org/MPL/2.0/.
  8. import sys, os
  9. # Add the igl library to the modules search path
  10. sys.path.insert(0, os.getcwd() + "/../")
  11. import pyigl as igl
  12. from shared import TUTORIAL_SHARED_PATH, check_dependencies
  13. dependencies = ["viewer"]
  14. check_dependencies(dependencies)
  15. V = igl.eigen.MatrixXd()
  16. U = igl.eigen.MatrixXd()
  17. F = igl.eigen.MatrixXi()
  18. c = 0
  19. bbd = 1.0
  20. twod = False
  21. if not igl.read_triangle_mesh(TUTORIAL_SHARED_PATH + "beetle.off", V, F):
  22. print("failed to load mesh")
  23. twod = V.col(2).minCoeff() == V.col(2).maxCoeff()
  24. bbd = (V.colwiseMaxCoeff() - V.colwiseMinCoeff()).norm()
  25. L = igl.eigen.SparseMatrixd()
  26. M = igl.eigen.SparseMatrixd()
  27. igl.cotmatrix(V, F, L)
  28. L = -L
  29. igl.massmatrix(V, F, igl.MASSMATRIX_TYPE_DEFAULT, M)
  30. k = 5
  31. D = igl.eigen.MatrixXd()
  32. if not igl.eigs(L, M, k + 1, igl.EIGS_TYPE_SM, U, D):
  33. print("Eigs failed.")
  34. U = (U - U.minCoeff()) / (U.maxCoeff() - U.minCoeff())
  35. viewer = igl.viewer.Viewer()
  36. def key_down(viewer, key, mod):
  37. global U, c
  38. if key == ord(' '):
  39. U = U.rightCols(k)
  40. # Rescale eigen vectors for visualization
  41. Z = bbd * 0.5 * U.col(c)
  42. C = igl.eigen.MatrixXd()
  43. igl.parula(U.col(c), False, C)
  44. c = (c + 1) % U.cols()
  45. if twod:
  46. V.setcol(2, Z)
  47. viewer.data.set_mesh(V, F)
  48. viewer.data.compute_normals()
  49. viewer.data.set_colors(C)
  50. return True
  51. return False
  52. viewer.callback_key_down = key_down
  53. viewer.callback_key_down(viewer, ord(' '), 0)
  54. viewer.core.show_lines = False
  55. viewer.launch()