Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Алгоритмы > Нахождение среднего угла


Автор: maksimz 12.07.07, 11:16
Помогите пожалуйста ... уперся в проблему :wall: ...

Задача:
Есть набор точек расположенных по отношению к центру координат под разными углами.
Интервал величин 0-360 градусов
Надо найти среднюю величину угла для данных точек

Например:
имеем 3 точки расположеные под углами 359, 1 и 6 градусов соответственно ...
глядя на это очевидно что средний угол будет ((359-360) + 1 + 6)/3 = 2 градуса ...

Но вот как понять что в случае с 359 величину надо отнимать от 360 чтобы получить -1
а в случае 1 и 6 не надо ... ?
И если предположить что углы до какой-то величины считать отрицательными о после какой-то положительными до тогда до какой?

Причем надо знать что угол именно 359 а не 181 градус т.е. просто считать среднее по синусам например не получится ...

Спасибо

П/С:
Задача в том чтобы в пространстве Хафа линии сгруппировать по минимальному расстоянию и заменить на одну со средними радиусом и углом

Автор: Swindler 12.07.07, 11:20
Цитата maksimz @
Но вот как понять что в случае с 359 величину надо отнимать от 360 чтобы получить -1

смотреть что точка попала в 3 или 4 четверть? :unsure: тоесть если угол больше 180, то угол =угол -360

Автор: maksimz 12.07.07, 11:38
помоему получится та же проблема со сменой знака ... т.е. 181, 179 и 174 градуса ... среднее 178

а если по четвертям то 181 в 3-ей четверти и значит 181-360=-179 -> (-179+179+174)/3 = 174/3

Добавлено
я еёе понимаю как минимальное расстояние посчитать между углами но пока это не помогает

Минимальное расстояние:
Пусть а1 и а2 углы то минимальное расстояние между ними мр=а1-а2 если мр>180 то мр=360-мр

Автор: MBo 12.07.07, 14:19
сложить единичные векторы, направленные под нужными углами(Cos(fi[i]), Sin(f[i])), и вычислить угол (направление) результирующего вектора.

Автор: AVA12 12.07.07, 14:52
Гм. Если я правильно понял задачу, то решение элементарно:

Строим векторы одинаковой длины, которые образуют с осью заданные углы. Складываем эти векторы. Сумма векторов как раз и задает "средний" азимут.

По-моему, так.

Автор: maksimz 12.07.07, 15:16
спасибо
предпоследнее решение вроде работает :)

Автор: Го_ 13.07.07, 11:52
Цитата maksimz @
предпоследнее решение вроде работает
Так получится не средняя величина угла.

Автор: Pacific 13.07.07, 15:49
Го_
Ну да: arcsin((sin(30)+sin(45))/2) != (30+45)/2

Тогда нужно складывать именно значения углов, а оси проводить так, чтобы все углы попали в интервал (0, pi). Если оси провести так не удастся, значит, не судьба :rolleyes: Хотя... Можно отдельно посчитать средний угол для интервала (0, pi) и средний угол для интервала (pi, 2*pi) и сложить их с соответствующими весовыми коэффициентами. Нужно требовать от автора строгое определение того, что нужно вычислить. Тогда он и сам разберется :yes:

Еще один прикол: какой будет средний угол для углов 0 и 180? Он может быть равен 90 (если мы их рассматриваем как 0 и 180), и -90 (если мы их рассматриваем как 0 и -180). Направления прямо противоположные :P

Автор: maksimz 18.07.07, 13:38
На самом деле про "предпоследнее решение которое вроде работает" это о том что оно решает мою проблему ... а проблема смотри П/С первого сообщения :)

На сколько я его понял надо посчитать сумму синусов и сумму косинусов для углов среднее для которых надо найти и угол которому соответствуют полученые значения и есть искомый т.е. если имеем sum(sin(a)) и sum(cos(a)) то а это искомый угол и лично я решил что могу найти его как:
а=arctg(sum(sin(a))/sum(cos(a)))

Может я и ошибаюсь но подсчитав по нескольким вариантам получил то что и надо ... отсюда и "вроде работает"

По поводу 0 и 180 ... точки в пространстве Хафа (получаемого после преобразования Хафа на некотором изображении)
насколько я понимаю задаются полярными координатами т.е. если имеем 2 точки расположенные к центру под 0 и под 180 это означает что они соответствуют 2м параллельным прямым расположенным по разные стороны от центра и соответственно вопрос о том можно ли их объединить в одну сводится к сумме расстояний между ними и при условии что можно то средний угол я и не нахожу вообще :P

а переношу добавляемую точку в тот же квадрант в котором находится точка к которой я её добавляю

т.е. да я согласен что проблему не описал полностью ... но полного описания как оказалось и не требовалось ... :)

Автор: Velas 30.05.17, 20:53
maksimzСтолкнулся с вашей древней задачей о нахождении среднего значения между направлениями.
Решение:(Вы уж просите, я геодезист)
1. считаем, что направление это это угол (левый угол), отсчитываемый от точки северва по часовой стрелке и изменяющийся от 0 до 359.999(9);
2. исходя из 1 считаем, что существует предел в 360 градусов, но направление может быть только 0, однако из-за арифметических действий
возникает переполнение.;
3. Есть 2 или более направления - веер направлений, кол-во N. Приведём их к общему началу FirsnAl. В результате получим веер направлений в
котором любое направление Al[i] находится в пределах 0<=Al < Lim(360). Берём среднее Meam. Окончательный результат - Meam + First.

Var
BеерDirect : Array(1..N) of real;
tmp : Array(1..N) of real;
First : Real;
Summ : Real;
Meam : Real;
i : Integer;


//много лишнего, но для наглядности
//если считаете в радианах используйте масшабиррование и длинные целые.
Summ :=0;
First := BеерDirec;
for i := 1 to N do
begin
tmp[i] := BeepDirect[i] - First;
if tmp[i] <= 360 them
tmp[i] + 360;
Summ := Summ + tmp[i];
end;
Meam := Summ/N
Result := Meam + First;

1напр = 359 -359 = 0
2рапр = 001 -359 = 358 +360 = 2 / 2 = 1 + 359 = 0

Автор: MBo 31.05.17, 03:36
Velas
Что получится для примера автора 359, 1 и 6 градусов?
Или для углов 45, 315, 315?

Автор: amk 31.05.17, 16:02
Программа не работает.

После исправления ошибок будет работать, если углы лежат в пределах полукруга

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      Summ :=0;
      First := BеерDirect[1];
      for i := 1 to N do
        begin
        tmp := BeepDirect[i] - First;
        if tmp[i] > 180 then
          tmp = tmp - 360;
        Summ := Summ + tmp;
        end;
      Result := Summ/N + First;

Если направления лежат большим веером то, во-первых, затруднительно вообще определить, что есть среднее направление.
Первый вариант, дающий такое же решение для узких секторов, выбрать направление, минимизирующее сумму квадратов отклонений от него заданных углов. Но для некоторых наборов таких минимумов может быть несколько.
Другой. для каждого направления взять единичный направляющий вектор и в качестве среднего взять направление их суммы (если она отличается от нуля). Для малых разбросов результат почти совпадает.

Автор: Velas 31.05.17, 20:29
Ну да 'апечатка'. First - это минимальное направление из веера(в общем случае любое). Отсортируем список
(или массив так проще для восприятия информации человеком, но не обязательно) измерений Имеем:359°----(1)
359°----)1)
1°------(4)
4°----(359)
вычитаем из всех по 359--(1)
0°------(0)
2°------(3)
5°-----(358)
ищем среднее
(0°+2°+ 5°)/3 = 2°20'00"--{(0+3+358)/3 = 361/3 = (361-360)/3 = 0°20'00"}
складываем с 359°--(1)
1°20'00"-----------(1°20'00")

по другому прибавим ко всем направлениям по 1° (дополнение до 0°)



ищем среднее
(0°+2°+ 5°)/3 = 2°20'00"
складываем с 359°
1°20'00"

направления это не углы т.к.
1 угол = 2°
2 угол = 3°
среднее
(2°+ 3°)/2 := 2°30'00"

Для
Что получится для примера автора 359, 1 и 6 градусов?
Или для углов 45, 315, 315?

Добавлено
Разорвал текст, извините бывает.
Для MBo
Что получится для примера автора 359, 1 и 6 градусов?
Или для углов 45, 315, 315?

Углы Среднее = (45+315+315)/3 =255
направления = {((45-45)+(315-45)+(315-45))/3+45 = (0+270+270)/3+45 = 180/3+45 = 105°

Автор: Velas 31.05.17, 21:27
Схемка показывает, как измеряются направления
____________________________________________________l.pdf (, : 336)

Автор: MBo 01.06.17, 04:04
Цитата
Для MBo
Или для углов 45, 315, 315?

Углы Среднее = (45+315+315)/3 =255
направления = {((45-45)+(315-45)+(315-45))/3+45 = (0+270+270)/3+45 = 180/3+45 = 105°


В обоих случаях арифметика подвела, получится и там, и там 225, но это не так важно.

Если ветер день дул на северо-восток, а два дня на северо-запад, то у тебя в среднем получится направление на юго-запад :wacko: :-?


Автор же описал, какие результаты для него (и в большинстве практических применений) адекватны, а в данном случае выходит вовсе не то.

Автор: VisualProg 01.06.17, 14:27
Да, я уже понял что забыл про среднее арифметическое :D Извиняюсь за глупость)

Автор: dvz 21.04.18, 14:44
столкнулся с такой же проблемой при разработке метеостанции. данные об угле валятся каждые 5 секунд, и в т.ч. сколько отсчетов поступит к моменту отправки пакета (например на народный мониторинг) в общем тоже не известно. Пришел к такому способу усреднения: первый отсчет берется за базу. при поступлении следующего вычисляется дельта (разница) нового угла от базы и суммируется с предыдущими дельтами. Текущий средний угол получается суммой базы и среднего по дельтам. При вычислении разницы углов учитывается минимальное расстояние по кругу - то есть считаем разницу по часовой и разницу против часовой. Берем с наименьшим модулем. Так для примера 315 315 45 получим направление 345. При поступлении данных это выглядит как
315 - > база 315, дельта 0, отсчетов 1
315 - > дельта 0, отсчетов 2 - текущий угол 315 + 0/2
45 -> дельта по часовой ((360-315)+45 = 90) дельта против часовой (360-90=270) берем 90 - текущий угол 315 + 90/3 = 345
...
и так до момента фиксации пакета к отправке, дальше с начала

Автор: Akina 23.04.18, 05:05
dvz
А не проще сразу хранить текущий средний и количество имеющихся отсчётов? И соответственно при поступлении нового отсчёта пересчитывать текущее среднее (новое = предыдущее + дельта / кол.отсчётов)? При одном отсчёте в 5 секунд до значимой ошибки ждать придётся хренову тучу лет...

Автор: MBo 23.04.18, 06:32
Раз подняли ветку, пусть тут будет ссылка на статью Circular Values Math and Statistics

В частности, автор приводит расчет усреднения, свободный от недостатка векторного подхода, когда average(0+0+90)=atan(1/2)~25 градусов вместо 30 (сам не пробовал, чего-то у него функция возвращает set)

Автор: Akina 23.04.18, 06:45
MBo
Все три обсуждения в теме рассматривают задачу случайного направления при фиксированной точке измерения. Векторный же подход к усреднению - это совершенно иная задача.

Добавлено
dvz
Хотя подумал - на реальных данных подход вполне себе, а вот на модельных может и косяка дать...
Простейший пример - это отсчёты 0, 0 и 180... и вот что будет в итоге - 120 или 240,- я лично фиг знает.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)