added 402
This commit is contained in:
Executable
+107
@@ -0,0 +1,107 @@
|
||||
import igl
|
||||
|
||||
global resolve, z_max, z_dir, k, Z, V, F, b, bc, U
|
||||
|
||||
z_max = 1.0
|
||||
z_dir = -0.03
|
||||
k = 2
|
||||
resolve = True
|
||||
|
||||
|
||||
V = igl.eigen.MatrixXd()
|
||||
U = igl.eigen.MatrixXd()
|
||||
|
||||
Z = igl.eigen.MatrixXd()
|
||||
|
||||
F = igl.eigen.MatrixXi()
|
||||
b = igl.eigen.MatrixXi()
|
||||
|
||||
bc = igl.eigen.MatrixXd()
|
||||
|
||||
def pre_draw(viewer):
|
||||
global resolve, z_max, z_dir, k, Z, V, F, b, bc
|
||||
|
||||
if resolve:
|
||||
print k
|
||||
# T = igl.eigen.MatrixXd()
|
||||
igl.harmonic(V,F,b,bc,k,Z)
|
||||
# Z = T # FIXME
|
||||
resolve = False
|
||||
|
||||
U.setCol(2,z_max*Z)
|
||||
viewer.data.set_vertices(U)
|
||||
viewer.data.compute_normals()
|
||||
|
||||
if viewer.core.is_animating:
|
||||
z_max += z_dir
|
||||
z_dir *= (-1.0 if z_max>=1.0 or z_max<=0.0 else 1.0)
|
||||
|
||||
return False
|
||||
|
||||
def key_down(viewer, key, mods):
|
||||
global k, resolve
|
||||
|
||||
if key == ord(' '):
|
||||
viewer.core.is_animating = not viewer.core.is_animating
|
||||
elif key == ord('.'):
|
||||
k = k + 1
|
||||
k = (4 if k>4 else k)
|
||||
resolve = True
|
||||
elif key == ord(','):
|
||||
k = k - 1
|
||||
k = (1 if k<1 else k)
|
||||
resolve = True
|
||||
return True
|
||||
|
||||
|
||||
igl.readOBJ("../tutorial/shared/bump-domain.obj",V,F)
|
||||
U=V
|
||||
|
||||
# Find boundary vertices outside annulus
|
||||
|
||||
# is_outer = (V.rowwise().norm().array()-1.0)>-1e-15
|
||||
# is_inner = (V.rowwise().norm().array()-0.15)<1e-15
|
||||
# in_b = is_outer.array() || is_inner.array()
|
||||
#
|
||||
# igl.colon_int(0,V.rows()-1,b)
|
||||
# b.conservativeResize(stable_partition( b.data(), b.data()+b.size(),
|
||||
# [&in_b](int i)->bool{return in_b(i);})-b.data())
|
||||
|
||||
Vrn = V.rowwiseNorm()
|
||||
is_outer = [Vrn[i]-1.00 > -1e-15 for i in range(0,V.rows())]
|
||||
is_inner = [Vrn[i]-0.15 < 1e-15 for i in range(0,V.rows())]
|
||||
in_b = [ is_outer[i] or is_inner[i] for i in range(0,len(is_outer))]
|
||||
|
||||
b = igl.eigen.MatrixXi([[i for i in range(0,V.rows()) if (in_b[i])]]).transpose();
|
||||
|
||||
bc.resize(b.size(),1)
|
||||
|
||||
for bi in range(0,b.size()):
|
||||
bc[bi] = (0.0 if is_outer[b[bi]] else 1.0)
|
||||
|
||||
# Pseudo-color based on selection
|
||||
C = igl.eigen.MatrixXd(F.rows(),3)
|
||||
purple = igl.eigen.MatrixXd([[80.0/255.0,64.0/255.0,255.0/255.0]])
|
||||
gold = igl.eigen.MatrixXd([[255.0/255.0,228.0/255.0,58.0/255.0]])
|
||||
|
||||
for f in range(0,F.rows()):
|
||||
if( in_b[F[f,0]] and in_b[F[f,1]] and in_b[F[f,2]]):
|
||||
C.setRow(f,purple)
|
||||
else:
|
||||
C.setRow(f,gold)
|
||||
|
||||
# Plot the mesh with pseudocolors
|
||||
viewer = igl.viewer.Viewer()
|
||||
viewer.data.set_mesh(U, F)
|
||||
viewer.core.show_lines = False
|
||||
viewer.data.set_colors(C)
|
||||
# viewer.core.trackball_angle = igl.eigen.Quaterniond(0.81,-0.58,-0.03,-0.03)
|
||||
# viewer.core.trackball_angle.normalize()
|
||||
viewer.callback_pre_draw = pre_draw
|
||||
viewer.callback_key_down = key_down
|
||||
viewer.core.is_animating = True
|
||||
viewer.core.animation_max_fps = 30.0
|
||||
print("Press [space] to toggle animation.")
|
||||
print("Press '.' to increase k.")
|
||||
print("Press ',' to decrease k.")
|
||||
viewer.launch();
|
||||
Reference in New Issue
Block a user