Шаблон:Распространение радиоволн ВЧ/Реализация/encompassing aperture t::unify/Алгоритм
Пусть объединяются два сектора сферы, релизуемые классом классом encompassing_aperture_t - и , где - вектор направления на центральную точку -го сектора (возвращаемый методом encompassing_aperture_t::central_point), а - соответствующий ангулярный радиус (возвращаемый методом encompassing_aperture_t::radius).
В результате объединения создается новый сектор .
Вектора могут быть либо нулевыми либо единичными. Сектор с нулевым вектором направления считается нейтральным по операции объединения, т.е. .
Далее рассматривается случай, в котором .
Поскольку направленные отрезки и исходят из одной точки - центра сферы, оба отрезка принадлежат одной плоскости, причем эта плоскость является диаметральным сечением сферы. Поэтому задача поиска объединяющего сектора, то есть вектора и ангулярного радиуса , становится двумерной.
Пусть далее , где - угол между и .
Существует три случая.
Рассмотрим первый случай, когда (то есть ). Поскольку длины всех векторов равны единице, , а количество плоскостей, которым одновременно могут принадлежать и бесконечно, вследствие чего количество возможных секторов минимальной площади, объединяющих и , также бесконечно и зависит от того на какой из плоскостей будут принадлежать выбранные и ; и этот выбор будет сводится к выбору диаметральной плоскости, проходящей через .
Этот выбор можно сделать, если задать произвольный вектор , перпендикулярный .
В описываемой реализации
- .
Тогда на плоскости, которой одновременно принадлежат , и , будет однозначно определен вектор , отстоящий на одинаковом угловом расстоянии от векторов и и, поэтому, параллельный вектору центральной точки сектора-объединения.
Для нахождения вектора достаточно выразить его в базисе и осуществить переход к мировой системе координат входной модели. Как видно из рисунка, в указанном базисе вектор имеет координаты
- ,
причем .
Тогда в мировых координатах
- .
Пусть и .
Тогда .
Отсюда
- ,
а ангулярный радиус будет равен
- .
Во втором случае , однако (то есть ).
Решение задачи объединения сводится к поиску вектрра , перпендикулярного (и ), лежащего в плоскости и , имеющего острый угол одновременно с и с и нормализованного.
Поскольку вектора и линейно-независимы, их можно использовать в качестве базиса для поиска вектора, сонаправленного с , следующим образом.
Опустим перпендикуляр от конца одного из векторов, например , на вектор , перперндикулярный и образующий острый угол с . Обозначим вектор, связанный с направленным отрезком, который исходит от центра сферы к точке пересечения и проведенного перпендикуляра, как . Такой вектор очевидно будет сонаправлен с , а его длина будет равна
- ;
- .
Обозначим как и соответственно проекции вектора на и а равно координаты вектора в базисе . Из теоремы синусов следует, что
- .
Тогда в базисе вектор будет равен:
- .