MBP = {
let perimeter = [],
remainingIndices = d3.range(0, border.length),
lastBearing,
distance = 0;
perimeter.push(border[d3.maxIndex(border, p => p[1])]);
lastBearing = 90;
while (
!arrEq(perimeter[0], perimeter[perimeter.length - 1]) ||
perimeter.length == 1
) {
yield Promises.tick(200, {
type: "LineString",
coordinates: perimeter,
distance
});
const bearings = remainingIndices.map(i =>
calculateBearing(perimeter[perimeter.length - 1], border[i])
);
const nextIndex = d3.minIndex(bearings, b => {
if (b > lastBearing) {
return b - lastBearing;
} else if (b > lastBearing - 90) {
return b - lastBearing;
} else if (b < lastBearing - 180) {
return b + 360 - lastBearing;
} else {
return NaN;
}
});
lastBearing = bearings[nextIndex];
perimeter.push(border[nextIndex]);
distance += calculateDistance(
perimeter[perimeter.length - 2],
perimeter[perimeter.length - 1]
);
}
yield { type: "Polygon", coordinates: [perimeter], distance };
}