На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Нахождение среднего угла
    Помогите пожалуйста ... уперся в проблему :wall: ...

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

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

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

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

    Спасибо

    П/С:
    Задача в том чтобы в пространстве Хафа линии сгруппировать по минимальному расстоянию и заменить на одну со средними радиусом и углом
      Цитата maksimz @
      Но вот как понять что в случае с 359 величину надо отнимать от 360 чтобы получить -1

      смотреть что точка попала в 3 или 4 четверть? :unsure: тоесть если угол больше 180, то угол =угол -360
        помоему получится та же проблема со сменой знака ... т.е. 181, 179 и 174 градуса ... среднее 178

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

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

        Минимальное расстояние:
        Пусть а1 и а2 углы то минимальное расстояние между ними мр=а1-а2 если мр>180 то мр=360-мр
          сложить единичные векторы, направленные под нужными углами(Cos(fi[i]), Sin(f[i])), и вычислить угол (направление) результирующего вектора.
            Гм. Если я правильно понял задачу, то решение элементарно:

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

            По-моему, так.
              спасибо
              предпоследнее решение вроде работает :)
                Цитата maksimz @
                предпоследнее решение вроде работает
                Так получится не средняя величина угла.
                  Го_
                  Ну да: 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
                  Сообщение отредактировано: Pacific -
                    На самом деле про "предпоследнее решение которое вроде работает" это о том что оно решает мою проблему ... а проблема смотри П/С первого сообщения :)

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

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

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

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

                    т.е. да я согласен что проблему не описал полностью ... но полного описания как оказалось и не требовалось ... :)
                    Сообщение отредактировано: maksimz -
                      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
                        Velas
                        Что получится для примера автора 359, 1 и 6 градусов?
                        Или для углов 45, 315, 315?
                          Программа не работает.

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

                          ExpandedWrap disabled
                              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;

                          Если направления лежат большим веером то, во-первых, затруднительно вообще определить, что есть среднее направление.
                          Первый вариант, дающий такое же решение для узких секторов, выбрать направление, минимизирующее сумму квадратов отклонений от него заданных углов. Но для некоторых наборов таких минимумов может быть несколько.
                          Другой. для каждого направления взять единичный направляющий вектор и в качестве среднего взять направление их суммы (если она отличается от нуля). Для малых разбросов результат почти совпадает.
                            Ну да 'апечатка'. 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°
                              Схемка показывает, как измеряются направления
                              Прикреплённый файлПрикреплённый файл____________________________________________________l.pdf (51,62 Кбайт, скачиваний: 334)
                                Цитата
                                Для 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: :-?


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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0533 ]   [ 18 queries used ]   [ Generated: 28.03.24, 17:17 GMT ]