509_Planarization.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. import random
  6. from math import cos, sin, pi
  7. TUTORIAL_SHARED_PATH = "../../tutorial/shared/"
  8. viewer = igl.viewer.Viewer()
  9. # Quad mesh generated from conjugate field
  10. VQC = igl.eigen.MatrixXd()
  11. FQC = igl.eigen.MatrixXi()
  12. FQCtri = igl.eigen.MatrixXi()
  13. PQC0 = igl.eigen.MatrixXd()
  14. PQC1 = igl.eigen.MatrixXd()
  15. PQC2 = igl.eigen.MatrixXd()
  16. PQC3 = igl.eigen.MatrixXd()
  17. # Planarized quad mesh
  18. VQCplan = igl.eigen.MatrixXd()
  19. FQCtriplan = igl.eigen.MatrixXi()
  20. PQC0plan = igl.eigen.MatrixXd()
  21. PQC1plan = igl.eigen.MatrixXd()
  22. PQC2plan = igl.eigen.MatrixXd()
  23. PQC3plan = igl.eigen.MatrixXd()
  24. def key_down(viewer, key, modifier):
  25. if key == ord('1'):
  26. # Draw the triangulated quad mesh
  27. viewer.data.set_mesh(VQC, FQCtri)
  28. # Assign a color to each quad that corresponds to its planarity
  29. planarity = igl.eigen.MatrixXd()
  30. igl.quad_planarity(VQC, FQC, planarity)
  31. Ct = igl.eigen.MatrixXd()
  32. igl.jet(planarity, 0, 0.01, Ct)
  33. C = igl.eigen.MatrixXd(FQCtri.rows(), 3)
  34. C.setTopRows(Ct.rows(), Ct)
  35. C.setBottomRows(Ct.rows(), Ct)
  36. viewer.data.set_colors(C)
  37. # Plot a line for each edge of the quad mesh
  38. viewer.data.add_edges(PQC0, PQC1, igl.eigen.MatrixXd([[0, 0, 0]]))
  39. viewer.data.add_edges(PQC1, PQC2, igl.eigen.MatrixXd([[0, 0, 0]]))
  40. viewer.data.add_edges(PQC2, PQC3, igl.eigen.MatrixXd([[0, 0, 0]]))
  41. viewer.data.add_edges(PQC3, PQC0, igl.eigen.MatrixXd([[0, 0, 0]]))
  42. elif key == ord('2'):
  43. # Draw the planar quad mesh
  44. viewer.data.set_mesh(VQCplan, FQCtri)
  45. # Assign a color to each quad that corresponds to its planarity
  46. planarity = igl.eigen.MatrixXd()
  47. igl.quad_planarity(VQCplan, FQC, planarity)
  48. Ct = igl.eigen.MatrixXd()
  49. igl.jet(planarity, 0, 0.01, Ct)
  50. C = igl.eigen.MatrixXd(FQCtri.rows(), 3)
  51. C.setTopRows(Ct.rows(), Ct)
  52. C.setBottomRows(Ct.rows(), Ct)
  53. viewer.data.set_colors(C)
  54. # Plot a line for each edge of the quad mesh
  55. viewer.data.add_edges(PQC0plan, PQC1plan, igl.eigen.MatrixXd([[0, 0, 0]]))
  56. viewer.data.add_edges(PQC1plan, PQC2plan, igl.eigen.MatrixXd([[0, 0, 0]]))
  57. viewer.data.add_edges(PQC2plan, PQC3plan, igl.eigen.MatrixXd([[0, 0, 0]]))
  58. viewer.data.add_edges(PQC3plan, PQC0plan, igl.eigen.MatrixXd([[0, 0, 0]]))
  59. else:
  60. return False
  61. return True
  62. # Load a quad mesh generated by a conjugate field
  63. igl.readOFF(TUTORIAL_SHARED_PATH + "inspired_mesh_quads_Conjugate.off", VQC, FQC)
  64. # Convert it to a triangle mesh
  65. FQCtri.resize(2 * FQC.rows(), 3)
  66. FQCtriUpper = igl.eigen.MatrixXi(FQC.rows(), 3)
  67. FQCtriLower = igl.eigen.MatrixXi(FQC.rows(), 3)
  68. FQCtriUpper.setCol(0, FQC.col(0))
  69. FQCtriUpper.setCol(1, FQC.col(1))
  70. FQCtriUpper.setCol(2, FQC.col(2))
  71. FQCtriLower.setCol(0, FQC.col(2))
  72. FQCtriLower.setCol(1, FQC.col(3))
  73. FQCtriLower.setCol(2, FQC.col(0))
  74. FQCtri.setTopRows(FQCtriUpper.rows(), FQCtriUpper)
  75. FQCtri.setBottomRows(FQCtriLower.rows(), FQCtriLower)
  76. igl.slice(VQC, FQC.col(0), 1, PQC0)
  77. igl.slice(VQC, FQC.col(1), 1, PQC1)
  78. igl.slice(VQC, FQC.col(2), 1, PQC2)
  79. igl.slice(VQC, FQC.col(3), 1, PQC3)
  80. # Planarize it
  81. igl.planarize_quad_mesh(VQC, FQC, 100, 0.005, VQCplan)
  82. # Convert the planarized mesh to triangles
  83. igl.slice(VQCplan, FQC.col(0), 1, PQC0plan)
  84. igl.slice(VQCplan, FQC.col(1), 1, PQC1plan)
  85. igl.slice(VQCplan, FQC.col(2), 1, PQC2plan)
  86. igl.slice(VQCplan, FQC.col(3), 1, PQC3plan)
  87. # Launch the viewer
  88. key_down(viewer, ord('2'), 0)
  89. viewer.core.invert_normals = True
  90. viewer.core.show_lines = False
  91. viewer.callback_key_down = key_down
  92. viewer.launch()