UNPKG

molstar

Version:

A comprehensive macromolecular library.

53 lines 1.64 kB
/** * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author Alexander Rose <alexander.rose@weirdbyte.de> */ /** * 2D Euclidean distance transform by Felzenszwalb & Huttenlocher https://cs.brown.edu/~pff/papers/dt-final.pdf */ export function edt(data, width, height, f, d, v, z) { for (var x = 0; x < width; x++) { for (var y = 0; y < height; y++) { f[y] = data[y * width + x]; } edt1d(f, d, v, z, height); for (var y = 0; y < height; y++) { data[y * width + x] = d[y]; } } for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { f[x] = data[y * width + x]; } edt1d(f, d, v, z, width); for (var x = 0; x < width; x++) { data[y * width + x] = Math.sqrt(d[x]); } } } /** * 1D squared distance transform */ function edt1d(f, d, v, z, n) { v[0] = 0; z[0] = Number.MIN_SAFE_INTEGER; z[1] = Number.MAX_SAFE_INTEGER; for (var q = 1, k = 0; q < n; q++) { var s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); while (s <= z[k]) { k--; s = ((f[q] + q * q) - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]); } k++; v[k] = q; z[k] = s; z[k + 1] = Number.MAX_SAFE_INTEGER; } for (var q = 0, k = 0; q < n; q++) { while (z[k + 1] < q) k++; d[q] = (q - v[k]) * (q - v[k]) + f[v[k]]; } } //# sourceMappingURL=distance-transform.js.map