Найти тему
Игорь Назаров

Блок ориентации

Мы подготовили модель орбитального движения и проверили ее на примере спутника Земли, получив хорошую сходимость с теоретическим расчетом. Теперь мы можем оценивать траектории ИСЗ вокруг Земли по самым разным орбитам. Но у нас нет инструментов для оценки видимости спутника относительно наблюдателя.

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

Создадим еще один модуль - Vect3D и уже опробованными нами приемом унаследуем от класса Array класс Vect3D. Приступим к добавлению методов, часть из которых будет проста и прозрачна - сложение и вычитание двух координат, умножение и деление вектора на скаляр, получение абсолютной величины вектора, приведение вектора к единичному.

Базовые функции для работы с векторами в трехмерном пространстве
Базовые функции для работы с векторами в трехмерном пространстве

Две следующие функции немного сложнее. Именно они нужны для получения углов - это скалярное (dotProduct) и векторное (crossProduct) произведение. Первое нужно нам для абсолютной величины угла между векторами, второе - для извлечения знака(к сожалению, косинус в определении скалярного произведения - четная функция, которая не сохраняет знак угла).

Векторное и скалярное произведения векторов. А также преобразование из декартовых координат в полярные. Оно нам еще пригодится.
Векторное и скалярное произведения векторов. А также преобразование из декартовых координат в полярные. Оно нам еще пригодится.

Теперь мы можем определять положение точек друг относительно друга и перейдем к решению более практичных задач.

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

Для этого создадим класс Plane и включим в него методы, задающие плоскость и проецирующие на эту плоскость точки.

Класс плоскости и методы для оценки взаимного положения точек и плоскостей
Класс плоскости и методы для оценки взаимного положения точек и плоскостей

Проверим работу этого блока, создав плоскость, а затем разбросав в четырех квадрантах этой плоскости по точке и измерив азимут этих точек. При переходе "лево-верх" -> "лево-низ" -> "право-низ" -> "право-верх" азимут будет изменяться от 0 до 360 градусов.

Проведем плоскость, параллельную плоскости XZ, разместим наблюдателя в точке bPoint

Мы создаем плоскость, затем раскидываем над ней точки и проверяем азимут.
Мы создаем плоскость, затем раскидываем над ней точки и проверяем азимут.

Проиллюстрируем этот код картинкой

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

Мы при расчете азимута точки проецируются на плоскость наблюдения, так что мы проигнорируем их высоту Y. Выведем результаты в консоль, сопоставим расчет с графиком.

Порядок вывода соответствует коду над графиком. Еще здесь указаны расчеты углы возвышения, но о них - чуть позже.
Порядок вывода соответствует коду над графиком. Еще здесь указаны расчеты углы возвышения, но о них - чуть позже.

Угол возвышения мы считаем чуть хитрее, чем кажется на первый взгляд - не через угол между направлением на точку и на ее проекцию, а через разность 180 градусов и угла между местной вертикалью и точкой - чтобы сохранить знак.

Вспомним, что наша плоскость проходит на уровне Y = 1. Значит первая точка с Y = -4,5 будет под горизонтом, затем Y = 2,5 - чуть выше. С остальными точками нет вопросов. Мы поднимаем координату Y, и угол возвышения растет.

Мы научились определять угловое положение точки относительно наблюдателя. В следующий раз мы совместим орбитальный расчет с оценкой областей видимости и попробуем сделать из этого выводы.

Наука
7 млн интересуются