signed-distance
Version:
Signed distance field computations
43 lines (40 loc) • 890 B
JavaScript
var numeric = require("numeric");
var EPSILON = 1e-6;
function signedDistance(grid, faceNormals, x) {
var result = grid.closestCells(x);
if(!result) {
return Number.NaN;
}
if(result.distance < EPSILON) {
return 0.0;
}
var best_n = 0.0;
var polarity = false;
var cells = result.cells;
var points = result.points;
for(var i=0; i<cells.length; ++i) {
var l = 0.0;
var n = 0.0;
var p = points[i];
var fn = faceNormals[cells[i]];
for(var j=0; j<x.length; ++j) {
var d = p[j] - x[j];
l += d * d;
n += fn[j] * d;
}
n /= Math.sqrt(l);
if(n < 0) {
n = -n;
if(n > best_n) {
best_n = n;
polarity = true;
}
} else if(n > best_n) {
best_n = n;
polarity = false;
}
}
var r = Math.sqrt(result.distance);
return polarity ? r : -r;
}
module.exports = signedDistance;