rec_harmonic_map
Harmonic map of a 3D simply-connected surface to 2D unit square
Contents
Syntax
uv = rect_harmonic_map(face,vertex,corner)
Description
face : double array, nf x 3, connectivity of mesh vertex: double array, nv x 3, vertex of mesh corner: double array, 4 x 1, four corners (index) on the mesh to be mapped to corners of unit square
uv: double array, nv x 2, uv coordinates of vertex on 2D unit square domain
Contribution
Author : Wen Cheng Feng Created: 2014/03/18 Revised: 2014/03/24 by Wen, add doc
Copyright 2014 Computational Geometry Group Department of Mathematics, CUHK http://www.math.cuhk.edu.hk/~lmlui
function uv = rect_harmonic_map(face,vertex,corner) nv = size(vertex,1); bd = compute_bd(face); nbd = size(bd,1); i = find(bd==corner(1),1,'first'); bd = bd([i:end,1:i]); corner = corner([1:end,1]); ck = zeros(size(corner)); k = 1; for i = 1:length(bd) if(bd(i) == corner(k)) ck(k) = i; k = k+1; end end uvbd = zeros(nbd,2); uvbd(ck(1):ck(2),1) = linspace(0,1,ck(2)-ck(1)+1)'; uvbd(ck(1):ck(2),2) = 0; uvbd(ck(2):ck(3),1) = 1; uvbd(ck(2):ck(3),2) = linspace(0,1,ck(3)-ck(2)+1)'; uvbd(ck(3):ck(4),1) = linspace(1,0,ck(4)-ck(3)+1)'; uvbd(ck(3):ck(4),2) = 1; uvbd(ck(4):ck(4),1) = 0; uvbd(ck(4):ck(5),2) = linspace(1,0,ck(5)-ck(4)+1)'; uvbd(end,:) = []; bd(end) = []; uv = zeros(nv,2); uv(bd,:) = uvbd; in = true(nv,1); in(bd) = false; A = laplace_beltrami(face,vertex); Ain = A(in,in); rhs = -A(in,bd)*uvbd; uvin = Ain\rhs; uv(in,:) = uvin;