function init_morph() { function load_data(path) { var deferred = new $.Deferred(); var oReq = new XMLHttpRequest(); oReq.open("GET", path, true); oReq.responseType = "arraybuffer"; oReq.onload = function (oEvent) { var arrayBuffer = oReq.response; // Note: not oReq.responseText if (arrayBuffer) { var data = new Float32Array(arrayBuffer); deferred.resolve(data); }else{ deferred.reject(); } }; oReq.send(null); return deferred.promise(); } function load_targets(path) { var deferred = new $.Deferred(); var oReq = new XMLHttpRequest(); oReq.open("GET", path, true); oReq.responseType = "text"; oReq.onload = function (oEvent) { if (this.readyState == 4 && this.status == 200) { var target_set = JSON.parse(this.responseText); var shape = target_set[0]["shape"]; var scale = target_set[0]["scale"]; load_data(target_set[0]["path"]).then(function(data){ var target_contours = {}; for(var cls = 0; cls < shape[0]; ++cls) { var contour = []; for(var length = 0; length < shape[1]; ++length) { var index = (cls*shape[1] + length)*shape[2]; contour.push(data.slice(index, index+2)); } target_contours[cls + 1] = contour; } deferred.resolve(target_contours, scale); }, function(){ deferred.reject(); }); }else{ deferred.reject(); } }; oReq.send(null); return deferred.promise(); } load_targets("morph_data/desc.json").then(on_ready); function mod(v, n) { return ((v%n)+n)%n; }; function find_a_center(points) { var sumx = 0; for(var i = 0;i= cx && cx > points[i + 1][0]) ) crosses.push((points[i][1] + points[i + 1][1]) * 0.5); } crosses.sort(function(a, b){return a - b;}); var max_value = 0; var max_index = 0; for (var i = 0;i max_value) { max_value = v; max_index = i; } } var cy = (crosses[2 * max_index] + crosses[2 * max_index + 1]) * 0.5; return [cx, cy] } function transform_polar(xys, width, height, scale) { var stats = {}; width = width || 1.0; height = height || 1.0; scale = scale || [1.0, 1.0]; var center = find_a_center(xys); center[0] = center[0]*width/scale[0]; center[1] = center[1]*height/scale[1]; stats.center = center; var min_x = width; var min_y = height; var max_xy = 0; var imin_x = 0; var imin_y = 0; var imax_xy = 0; var R = []; var T = []; var X = []; var Y = []; for(var i = 0;i m && r > m && ll > m && rr > m){ out.push(_i); } } out.push(mod(end, Rs.length)); return out; } function delta_theta(t0, t1) { if(t0 > t1) return Math.min(t0-t1, 2*Math.PI - t0 + t1); else return Math.min(t1-t0, 2*Math.PI - t1 + t0); } function interpolate_theta(t0, t1, alpha) { var a0 = 1-alpha; var a1 = alpha; if(t1 > t0){ if(t1 - t0 < Math.PI*2 + t0 - t1) return t0*a0 + t1*a1; else return (t0+Math.PI*2)*a0 + t1*a1; }else{ if(t0 - t1 < Math.PI*2 + t1 - t0) return t0*a0 + t1*a1; else return t0*a0 + (t1+Math.PI*2)*a1; } } function DTW(iN, nstat, iM, mstat) { var table = []; var visit = []; for(var i = 0;i= f? (t-f): (t + L - f); } function _fi(f, t, L, s) { if(t >= f) { return f*(1-s) + s*t; } let k = f*(1-s) + s*(t + L); return k >= L? k-L: k; } function _i(V, a, L) { let f = mod(parseInt(Math.floor(a)), L); let t = mod(parseInt(Math.ceil(a)), L); let s = a - f; return V[f]*(1-s) + V[t]*s; } var L = stats.R.length; for(var i = 0;i