Files
igl/python/tutorial/507_PolyVectorField.py
T

137 lines
3.0 KiB
Python
Executable File

import sys, os
import random
from math import cos,sin,pi
# Add the igl library to the modules search path
sys.path.insert(0, os.getcwd() + "/../")
import pyigl as igl
from shared import TUTORIAL_SHARED_PATH, check_dependencies
dependencies = ["embree", "viewer"]
check_dependencies(dependencies)
# Input mesh
V = igl.eigen.MatrixXd()
F = igl.eigen.MatrixXi()
# Per face bases
B1 = igl.eigen.MatrixXd()
B2 = igl.eigen.MatrixXd()
B3 = igl.eigen.MatrixXd()
# Face barycenters
B = igl.eigen.MatrixXd()
# Scale for visualizing the fields
global_scale = 1
# Random length factor
rand_factor = 5
samples = igl.eigen.MatrixXi()
def readSamples(fname):
samples = igl.eigen.MatrixXi()
numSamples = 0
fp = open(fname, 'r')
numSamples = int(fp.readline())
samples.resize(numSamples,1)
for i in range(0,numSamples):
samples[i] = int(fp.readline())
fp.close()
return samples
# Create a random set of tangent vectors
def random_constraints(b1, b2, n):
r = igl.eigen.MatrixXd(1,n*3)
for i in range(0,n):
a = random.random()*2*pi
s = 1 + random.random() * rand_factor
t = s * (cos(a) * b1 + sin(a) * b2)
r.setBlock(0,i*3,1,3,t)
return r
def key_down(viewer, key, modifier):
if key < ord('1') or key > ord('8'):
return False
viewer.data.lines.resize(0,9)
num = key - ord('0')
# Interpolate
print("Interpolating " + repr(num * 2) + "-PolyVector field")
b = igl.eigen.MatrixXi([[4550, 2321, 5413, 5350]]).transpose()
bc = igl.eigen.MatrixXd(b.size(),num*3)
for i in range(0,b.size()):
t = random_constraints(B1.row(b[i]),B2.row(b[i]),num)
bc.setRow(i,t)
# Interpolated PolyVector field
pvf = igl.eigen.MatrixXd()
igl.n_polyvector(V, F, b, bc, pvf)
# Highlight in red the constrained faces
C = igl.eigen.MatrixXd.Constant(F.rows(),3,1)
for i in range(0,b.size()):
C.setRow(b[i],igl.eigen.MatrixXd([[1, 0, 0]]))
viewer.data.set_colors(C)
for n in range(0,num):
VF = igl.eigen.MatrixXd.Zero(F.rows(),3)
for i in range(0,b.size()):
VF.setRow(b[i],bc.block(i,n*3,1,3))
for i in range(0,samples.rows()):
VF.setRow(samples[i],pvf.block(samples[i],n*3,1,3))
c = VF.rowwiseNorm()
C2 = igl.eigen.MatrixXd()
igl.jet(c,1,1+rand_factor,C2)
viewer.data.add_edges(B - global_scale*VF, B + global_scale*VF , C2)
return False
# Load a mesh in OBJ format
igl.readOBJ("../../tutorial/shared/lilium.obj", V, F)
samples = readSamples("../../tutorial/shared/lilium.samples.0.2")
# Compute local basis for faces
igl.local_basis(V,F,B1,B2,B3)
# Compute face barycenters
igl.barycenter(V, F, B)
# Compute scale for visualizing fields
global_scale = 0.2*igl.avg_edge_length(V, F)
# Make the example deterministic
random.seed(0)
viewer = igl.viewer.Viewer()
viewer.data.set_mesh(V, F)
viewer.callback_key_down = key_down
viewer.core.show_lines = False
key_down(viewer,ord('2'),0)
viewer.launch()