В комментарии вы упомянули, что все «углы», которые необходимо усреднить, находятся в пределах 90 градусов друг к другу. Я предполагаю, что на самом деле есть только одна камера, но она много перемещается, и вы создаете какой-то механизм стабильности изображения для камеры POV.
В любом случае существует только специальный случай, когда камера может находиться в квадранте 270-359 и в квадранте 0-89. Для всех остальных случаев вы можете просто взять простой средний показатель. Таким образом, вам просто нужно обнаружить этот особый случай, и когда это произойдет, обработайте углы в квадранте 270-359 вместо -90 -1. Затем, после вычисления простого среднего, при необходимости отрегулируйте его обратно в сектор 270-359.
В коде C:
int quadrant (int a) {
assert(0 <= a && a < 360);
return a/90;
}
double avg_rays (int rays[], int num) {
int i;
int quads[4] = { 0, 0, 0, 0 };
double sum = 0;
/* trivial case */
if (num == 1) return rays[0];
for (i = 0; i < num; ++i) ++quads[quadrant(rays[i])];
if (quads[0] == 0 || quads[3] == 0) {
/* simple case */
for (i = 0; i < num; ++i) sum += rays[i];
return sum/num;
}
/* special case */
for (i = 0; i < num; ++i) {
if (quadrant(rays[i]) == 3) rays[i] -= 360;
sum += rays[i];
}
return sum/num + (sum < 0) * 360;
}
Этот код может быть оптимизирован за счет ясности цели. Когда вы обнаруживаете особый случай, вы можете исправить sum
после факта. Итак, вы можете вычислить sum
и разобраться в специальном футляре и сделать исправление за один проход.
double avg_rays_opt (int rays[], int num) {
int i;
int quads[4] = { 0, 0, 0, 0 };
double sum = 0;
/* trivial case */
if (num == 1) return rays[0];
for (i = 0; i < num; ++i) {
++quads[quadrant(rays[i])];
sum += rays[i];
}
if (quads[0] == 0 || quads[3] == 0) {
/* simple case */
return sum/num;
}
/* special case */
sum -= quads[3]*360;
return sum/num + (sum < 0) * 360;
}
Я уверен, что он может быть дополнительно оптимизирован, но он должен дать вам начало.
Подсказка: в принципе, вы пытаетесь найти угол вектора, который представляет собой сумму векторов, представляющих ваши указания. – sashkello
Является ли моя математика неправильной или 1-359 недостаточно для круга? – Greg
На самом деле не имеет смысла говорить об «усредняющих» углах. Если у вас есть два угла, вы можете разделить дугу между ними, но усреднение 3 или более углов довольно бессмысленно, если они не находятся относительно близко друг к другу. –