pts-to-graph
Version:
generate nearest neighbors for a set of 3d points. convert triangle mesh to graph. convert set of 3d points into an graph / ngraph.
56 lines (48 loc) • 1.69 kB
JavaScript
var _ = require('underscore');
//var setOfPts2NGraph = require('./set-of-pts-to-graph.js').setOfPts2NGraph;
function edgeHash(e0,e1){
return e0*e1+e0+e1; //fast sloppy hash
//e0*e1+e0+e1
// if(e0<e1){
// return e0+"_"+e1;
// }
// return e1+"_"+e0;
}
function mesh2PointsWithNeighbors(trisIndex){
var edges2Pts = {};
var pts2Edges = {};
//var neighborsByIndex = [];
var tc=trisIndex.cells;
var l = tc.length;
var sop = trisIndex.positions;
for(var i=0;i<l;i++) {
var cell = tc[i];
var c0=cell[0],c1=cell[1],c2=cell[2];
var edgeA = edgeHash(c0, c1);
var edgeB = edgeHash(c1, c2);
var edgeC = edgeHash(c2, c0);
pts2Edges[c0] = pts2Edges[c0] || [];
pts2Edges[c1] = pts2Edges[c1] || [];
pts2Edges[c2] = pts2Edges[c2] || [];
pts2Edges[c0].push(edgeA,edgeC);
pts2Edges[c1].push(edgeA,edgeB);
pts2Edges[c2].push(edgeB,edgeC);
edges2Pts[edgeA] = edges2Pts[edgeA] || [];
edges2Pts[edgeB] = edges2Pts[edgeB] || [];
edges2Pts[edgeC] = edges2Pts[edgeC] || [];
edges2Pts[edgeA].push(c0, c1);
edges2Pts[edgeB].push(c1, c2);
edges2Pts[edgeC].push(c2, c0);
}
sop = sop.map(function(p,i){
var edgeHashes = pts2Edges[i] || [];
var allNeighbors = [];
edgeHashes.forEach(function(hash){
allNeighbors.push(...(edges2Pts[hash] || []).map(id=>sop[id]));
})
p.neighbors = _.uniq(allNeighbors);
return p;
});
return sop;//{pts: sop, ngraph: setOfPts2NGraph(sop)};
}
module.exports = {mesh2PointsWithNeighbors: mesh2PointsWithNeighbors}