I have straight-forward functions for identifying edges in THREE.Geometry().
var edges = [];
for(var i = 0, l = geometry.faces.length; i < l; i++) { findAdjacentFaces(i, edges, geometry); }
function findAdjacentFaces(face_, edges_, geometry_){
var adjacentFaces = [];
if(face_ >= 0 && face_ < geometry_.faces.length){
for(var i = 0, l = geometry_.faces.length; i < l; i++){
if(i != face_){
if(checkAdjacent(geometry_.faces[face_], geometry_.faces[i]) == true ){
adjacentFaces.push(i);
}
}
if(adjacentFaces.length > 2) { break; }
}
}
if(adjacentFaces.length == 2){
edges_.push(setEdge(face_, adjacentFaces[0], adjacentFaces[1], geometry_));
}
}
function checkAdjacent(faceA_, faceB_){
var values = [faceA_.a, faceA_.b, faceA_.c, faceB_.a, faceB_.b, faceB_.c].sort();
var counter = 0;
var duplicates = {};
values.forEach(function(x) { duplicates[x] = (duplicates[x] || 0) + 1; if(duplicates[x] > 1) { counter++; } });
if(counter == 2) { return true; } else { return false; }
}
function setEdge(faceA_, faceB_, faceC_, geometry_){
var vertices = [], peak, tmpA, tmpB;
var values = [ geometry_.faces[faceA_].a, geometry_.faces[faceA_].b, geometry_.faces[faceA_].c,
geometry_.faces[faceB_].a, geometry_.faces[faceB_].b, geometry_.faces[faceB_].c,
geometry_.faces[faceC_].a, geometry_.faces[faceC_].b, geometry_.faces[faceC_].c ].sort();
var sideA = [geometry_.faces[faceA_].a, geometry_.faces[faceA_].b, geometry_.faces[faceA_].c];
var sideB = [geometry_.faces[faceB_].a, geometry_.faces[faceB_].b, geometry_.faces[faceB_].c];
var sideC = [geometry_.faces[faceC_].a, geometry_.faces[faceC_].b, geometry_.faces[faceC_].c];
var counter = 0;
var duplicates = {};
values.forEach(function(x) { duplicates[x] = (duplicates[x] || 0) + 1; });
for (const key of Object.keys(duplicates)) {
if(duplicates[key] == 2) { vertices.push(key); }
else if(duplicates[key] == 3) { peak = key; }
}
return [ Number(vertices[0]), Number(vertices[1]) ];
}
It returns all vertex indices on the edge of geometry. Work fine, but VERY slow. What could be optimized for speeding up?