using PyPlot using NtToolBox using Interpolations X, F = read_mesh("NtToolbox/src/data/nefertiti.off") n = size(X,2); B = compute_boundary(F); p = length(B); figure(figsize=(10,10)) #plot mesh plot_mesh(X, F, el=80,az=-100, lwdt=.6, dist=6) #plot boundary for i in 1:length(B) plot(X[1,B], X[2,B], X[3,B], color="red", lw=3) end W = spzeros(n,n) for i in 1:3 i2 = i%3+1 i3 = (i+1)%3+1 u = X[:,F[i2,:]] - X[:,F[i,:]] v = X[:,F[i3,:]] - X[:,F[i,:]] # normalize the vectors u = u ./ repeat(sqrt(sum(u.^2,1)), outer=(3,1)) v = v ./ repeat(sqrt(sum(v.^2,1)), outer=(3,1)) # compute angles alpha = 1./tan(acos(sum(u.*v, 1))) alpha = vec(max(alpha, 1e-2)') #avoid degeneracy W = W + sparse(F[i2,:],F[i3,:], alpha, n,n) W = W + sparse(F[i3,:],F[i2,:], alpha, n,n) end; d = sum(W,1) D = spdiagm(vec(d), 0,n,n) L = D - W; p = length(B) t = collect(linspace(0,2*pi,p+1)) deleteat!(t,p+1) Z = [cos(t)'; sin(t)']; L1 = copy(L) L1[B,:] = 0 for i in 1:length(B) L1[B[i], B[i]] = 1 end; R = zeros(2,n) R[:,B] = Z; Y = zeros(2,n) Y = (L1 \ R')'; figure(figsize=(10,10)) plot_mesh([Y;zeros(1,n)],F, lwdt = 1., c="lightgrey"); include("NtSolutions/meshdeform_1_parameterization/exo1.jl"); ## Insert your code here. include("NtSolutions/meshdeform_1_parameterization/exo2.jl"); include("NtSolutions/meshdeform_1_parameterization/exo3.jl"); ## Insert your code here. n1 = 256 T = load_image("NtToolBox/src/data/lena.png", n1) T = T[n1:-1:1,:]; C = rand(1000,3) C = C./repeat(sum(C,2),outer=(1,3)) C=C[:,[3,2,1]] C= sortcols(C) lambd=C'; fig = figure(figsize = (10,10)) ax = subplot(111, projection="3d") x = collect(linspace(0, 1, size(T,1))) #itp = interpolate(T', BSpline(Cubic(Line())), OnGrid()) itp = interpolate((x,x), T', Gridded(Linear())) for i in 1:size(F,2) px = Y[1,F[:,i]] py = Y[2,F[:,i]] points_x = lambd'*px points_y = lambd'*py points = [points_x ; points_y] col = zeros(size(points_x)) for ind in 1:size(points_x,1) col[ind] = itp[points_x[ind], points_y[ind]] end col = rescale(col) col = repeat(col,outer=(1,3)) Px = X[1,F[:,i]] Py = X[2,F[:,i]] Pz = X[3,F[:,i]] Points_x = lambd'*Px Points_y = lambd'*Py Points_z = lambd'*Pz scatter3D(Points_x,Points_y,Points_z,s=5,c=col,lw=0,alpha=1) ax[:view_init](80, -100) axis("off") ax[:dist]=6 end u1 = [247,266]*n1/512. u2 = [247,328]*n1/512. u3 = [161,301]*n1/512.; figure(figsize=(10,10)) imageplot(T) plot([u1[2],u2[2],u3[2],u1[2]], [u1[1],u2[1],u3[1],u1[1]], ".-b", ms=10, linewidth=2) gca()[:invert_yaxis]() v1 = [310,125]*n1/512. v2 = [315,350]*n1/512. v3 = [105,232]*n1/512.; figure(figsize=(10,10)) axis("off") Y_big = Y*(n1-1) + 1 beg = findn(W)[1] last = findn(W)[2] for i in 1:length(beg) plot([Y_big[1, beg[i]], Y_big[1,last[i]]],[Y_big[2,beg[i]], Y_big[2,last[i]]],c="blue",lw=2) end plot([v1[2],v2[2],v3[2],v1[2]], [v1[1],v2[1],v3[1],v1[1]], ".-r", ms=10, linewidth=3); T1 = perform_image_similitude(T,"affine",(u1-1)/n1,(v1-1)/n1,(u2-1)/n1,(v2-1)/n1,(u3-1)/n1,(v3-1)/n1); figure(figsize=(10,10)) axis("off") Y_big = Y*(n1-1) + 1 beg = findn(W)[1] last = findn(W)[2] for i in 1:length(beg) plot([Y_big[1, beg[i]], Y_big[1,last[i]]],[Y_big[2,beg[i]], Y_big[2,last[i]]],c="blue",lw=2) end plot([v1[2],v2[2],v3[2],v1[2]], [v1[1],v2[1],v3[1],v1[1]], ".-r", ms=10, linewidth=3) imageplot(T1) gca()[:invert_yaxis]() fig = figure(figsize = (10,10)) ax = subplot(111, projection="3d") x = collect(linspace(0, 1, size(T,1))) itp = interpolate((x,x), T1', Gridded(Linear())) for i in 1:size(F,2) px = Y[1,F[:,i]] py = Y[2,F[:,i]] points_x = lambd'*px points_y = lambd'*py points = [points_x ; points_y] col = zeros(size(points_x)) for ind in 1:size(points_x,1) col[ind] = itp[points_x[ind], points_y[ind]] end col = rescale(col) col = repeat(col,outer=(1,3)) Px = X[1,F[:,i]] Py = X[2,F[:,i]] Pz = X[3,F[:,i]] Points_x = lambd'*Px Points_y = lambd'*Py Points_z = lambd'*Pz scatter3D(Points_x,Points_y,Points_z,s=6,c=col,lw=0,alpha=1) ax[:view_init](80, -100) axis("off") ax[:dist]=6 end