def representative_to_nrosy(V, F, R, N, Y): B1 = igl.eigen.MatrixXd() B2 = igl.eigen.MatrixXd() B3 = igl.eigen.MatrixXd() igl.local_basis(V,F,B1,B2,B3) Y.resize(F.rows()*N, 3) for i in range (0,F.rows()): x = R.row(i) * B1.row(i).transpose() y = R.row(i) * B2.row(i).transpose() angle = atan2(y[0],x[0]) for j in range(0,N): anglej = angle + 2*pi*j/float(N) xj = cos(anglej) yj = sin(anglej) Y.setRow(i*N+j, xj * B1.row(i) + yj * B2.row(i))
# Contrain one face b = igl.eigen.MatrixXi([[0]]) bc = igl.eigen.MatrixXd([[1, 0, 0]]) # Create a smooth 4-RoSy field S = igl.eigen.MatrixXd() igl.comiso.nrosy(V, F, b, bc, igl.eigen.MatrixXi(), igl.eigen.MatrixXd(), igl.eigen.MatrixXd(), 4, 0.5, X1, S) # Find the the orthogonal vector B1 = igl.eigen.MatrixXd() B2 = igl.eigen.MatrixXd() B3 = igl.eigen.MatrixXd() igl.local_basis(V, F, B1, B2, B3) X2 = igl.rotate_vectors(X1, igl.eigen.MatrixXd.Constant(1, 1, pi / 2), B1, B2) gradient_size = 50 iterations = 0 stiffness = 5.0 direct_round = False # Always work on the bisectors, it is more general igl.compute_frame_field_bisectors(V, F, X1, X2, BIS1, BIS2) # Comb the field, implicitly defining the seams igl.comb_cross_field(V, F, BIS1, BIS2, BIS1_combed, BIS2_combed) # Find the integer mismatches
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