2016-06-14 6 views
1

У меня есть положение x, y тела, которое делает примерно круговые орбиты вокруг известной точки. Есть ли алгоритм, который даст мне количество орбит, которые этот орган делает с течением времени, если я кормлю его вектором x, y позиций? Меня не волнуют изменения расстояния на теле от «происхождения» орбиты.Как вычислить (подсчитать) количество орбит из позиционных данных?

EDIT 1:

Мое решение до сих пор:

  1. сдвига х, у Coords тела по х, у положение орбиты происхождения (то есть сделать происхождение орбиты [0, 0])
  2. вычислить atan2 х тела, чтобы получить радиан, а затем преобразовать в градусы
  3. сдвиг градусов, так что 0 является начальным расположением тела
  4. найти все точки поворота в степени векторе (найти 359-> 0 переходов)
  5. подсчет орбиты как число точек поворота + остаточного
+0

Этот вектор x, y позиций в любом конкретном порядке? –

+0

Да, это приказано. –

+0

Да? * Какой порядок? * Я пытаюсь заставить вас быть более конкретным в вашем вопросе. Список позиций не приносит мне никакой пользы, если он сортируется, увеличивая значение 'x'. Я предполагаю, что вы имеете в виду, что это в хронологическом порядке, причем 'a [0]' является самым ранним, а 'a [n]' является самым последним. Но в вашем вопросе не сказано, что любое решение, которое вы получаете, может быть недействительным. –

ответ

2

Следующий алгоритм предполагает, что существует более 2 позиции, хранящаяся на орбиту, с шагом меньше, чем 180 градусов.

В основном вы определяете «финишную черту» для орбиты с использованием первой позиции и увеличиваете счетчик, когда тело пересекает его, что вы можете обнаружить, когда знак точечного произведения вектора положения с нормальной строкой изменяется:

  • Возьмите вектор с известной точки, когда тело вращается вокруг первой позиции в вашей серии и найдите вектор, перпендикулярный к ней. В 2D вы можете сделать это, просто вычитая центральную точку из первой позиции, затем заменив компоненты x и y и отрицая одну из них. Этот вектор определяет нормаль к «финишной линии» каждой орбиты.
  • Возьмите вектор от центра ко второму положению в серии и найдите точечный продукт с нормальным значением, вычисленным выше, умножив компонентный.
  • Инициализировать подсчитывать орбиту к нулю
  • Для каждой оставшейся позиции в серии:
    • вычислить вектор от центра в положение, и скалярное произведение его с финишной линией нормальной. Если знак точечного произведения совпадает с знаком второй позиции и отличается от предыдущей позиции в ряду, увеличьте количество на единицу.

Вы можете работать дробную часть путем вычисления угла между последним положением и первым.

+0

Решение можно упростить, преобразовывая координаты x, y в угол между позицией и центральной точкой, используя функцию atan. –

+0

Я отредактировал мое первое сообщение с моим решением до сих пор. –

+1

@EyalShulman это зависит от того, что вы подразумеваете под «упрощенным»? Легче понять, проще реализовать или сделать меньше операций для ЦП? На мой взгляд, точечные продукты проще по всем трем критериям (это всего лишь два умножения и добавление), но первые два, по общему признанию, субъективны. – samgak