order = {
if (face_info.faces.length > 0) {
const tsp = new TravelingSalesman();
tsp.maxCycles = 100;
let points = face_info.faces.map((o, i) => {
let pt = [o._box._x + o._box._width / 2, o._box._y + o._box._height / 2];
pt.index = i;
return pt;
});
tsp.createFirstNeuron();
tsp.cities = points.map((d, i) => ({ x: d[0], y: d[1] }));
var done, pos;
do {
done = tsp.surveyRun();
let n = tsp.neurons.start;
pos = [[n.x, n.y]];
for (let i = 0; i < tsp.neurons.length; i++) {
n = n.right;
pos.push([n.x, n.y]);
}
} while (!done && tsp.cycle < tsp.maxCycles);
let D = d3.Delaunay.from(pos);
let order = points.map((d) => D.find(d[0], d[1]));
order = points
.map((pt) => pt)
.sort((a, b) => order[a.index] - order[b.index])
.map((pt) => pt.index);
let start = order.slice(0, 13);
let fin = order.slice(13);
order = fin.concat(start);
return order[0] === -1 ? this : order;
} else {
return [];
}
}