Math.atan2(y, x)const d2r = d => d * Math.PI / 180;
const r2d = r => r * 180 / Math.PI;
const vec = arr => {
const sum = arr.map(
a => [Math.cos(d2r(a)), Math.sin(d2r(a))]
)
.reduce((p,c) => [p[0]+c[0], p[1]+c[1]], [0,0]);
return r2d( Math.atan2(sum[1], sum[0]));
}
vec([84, 276, 180]); // 180 
Брать среднее арифметическое, под любым соусом, для направлений – неверно.Путаете понятия: направление движения (как раз то, что в моём ответе) и вектор перемещения (это про что у Вас). ;)
Брать среднее арифметическое, под любым соусом, для направлений – неверно.Это Ваша фраза.
С действующим кодом ответ был бы понятнее.Аргументы закончились, остались только требования.
1. Если нужен ближайший разворот: то изначально зеркалируем углы относительно оси максимального расстояния: OX (т.е., все углы станут <180 градусов; 180 - это 0!).
2. Градусы переводим в проценты и делим сумму процентов на общее количество значений.Перевод в проценты и обратно из процентов в градусы – какую проблему решает?
И где там разворачиваться, на светофоре?Когда пересекается диаметр при движении по окружности, да. Направление движения меняется на противоположное)