Шаблон:Распространение радиоволн ВЧ/Реализация/encompassing aperture t::unify/Алгоритм: различия между версиями

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
 
(не показано 14 промежуточных версий этого же участника)
Строка 1: Строка 1:
Пусть объединяются два сектора сферы, релизуемые классом классом [[Распространение радиоволн ВЧ/Реализация/encompassing_aperture_t|encompassing_aperture_t]] - <math>\Omega_1=\left\langle\vec{c}_1, \alpha_1\right\rangle</math> и <math>\Omega_2=\left\langle\vec{c}_2, \alpha_2\right\rangle</math>, где <math>\vec{c}_i</math> - вектор направления на центральную точку <math>i</math>-го сектора (возвращаемый методом [[Распространение радиоволн ВЧ/Реализация/encompassing_aperture_t::central_point|encompassing_aperture_t::central_point]]), а <math>\alpha_i</math> - соответствующий ангулярный радиус (возвращаемый методом [[Распространение радиоволн ВЧ/Реализация/encompassing_aperture_t::radius|encompassing_aperture_t::radius]]).
Пусть объединяются два сектора сферы, релизуемые классом классом [[Распространение радиоволн ВЧ/Реализация/encompassing_aperture_t|encompassing_aperture_t]] - <math>\Omega_1=\left\langle\vec{c}_1, \alpha_1\right\rangle</math> и <math>\Omega_2=\left\langle\vec{c}_2, \alpha_2\right\rangle</math>, где <math>\vec{c}_i</math> - вектор направления на центральную точку <math>i</math>-го сектора (возвращаемый методом [[Распространение радиоволн ВЧ/Реализация/encompassing_aperture_t::central_point|encompassing_aperture_t::central_point]]), а <math>\alpha_i\in\left[0;\pi\right]</math> - соответствующий ангулярный радиус (возвращаемый методом [[Распространение радиоволн ВЧ/Реализация/encompassing_aperture_t::radius|encompassing_aperture_t::radius]]). Сектор, у которого ангулярный радиус равен <math>\pi</math> охватывает сферу полностью независимо от вектора <math>\vec{c}_i</math>.
[[Файл:encompassing_aperture_t.svg|thumb|Сектор [[Распространение радиоволн ВЧ/Реализация/encompassing_aperture_t|encompassing_aperture_t]]|400px]]
[[Файл:encompassing_aperture_t.svg|thumb|Сектор [[Распространение радиоволн ВЧ/Реализация/encompassing_aperture_t|encompassing_aperture_t]]|400px]]


Строка 12: Строка 12:
[[Файл:encompassing_aperture_t_unify.svg|thumb|
[[Файл:encompassing_aperture_t_unify.svg|thumb|
Диаметральное сечение сферы, которому принадлежат вектора <math>\vec{c}_1</math> и <math>\vec{c}_2</math>. Если <math>\vec{c'}_1\nparallel\vec{c'}_2</math>, то вектор <math>\vec{c}_{12}</math>, задающий направление на центральную точку объединяющего сектора, будет являться нормализованной суммой векторов <math>\vec{c'}_1</math> и <math>\vec{c'}_2</math>, если <math>\alpha_{12}<\frac{\pi}{2}</math> и противоположен этой сумме, если <math>\alpha_{12}>\frac{\pi}{2}</math>.|400px]]
Диаметральное сечение сферы, которому принадлежат вектора <math>\vec{c}_1</math> и <math>\vec{c}_2</math>. Если <math>\vec{c'}_1\nparallel\vec{c'}_2</math>, то вектор <math>\vec{c}_{12}</math>, задающий направление на центральную точку объединяющего сектора, будет являться нормализованной суммой векторов <math>\vec{c'}_1</math> и <math>\vec{c'}_2</math>, если <math>\alpha_{12}<\frac{\pi}{2}</math> и противоположен этой сумме, если <math>\alpha_{12}>\frac{\pi}{2}</math>.|400px]]
Пусть далее <math>\cos \gamma=\frac{\vec{c}_1\cdot\vec{c}_2}{\left|\vec{c}_1\right|\cdot\left|\vec{c}_2\right|}</math>, где <math>\gamma</math> - угол между <math>\vec{c}_1</math> и <math>\vec{c}_2</math>.
Два особых случая:
:<math>\Omega_1\subseteq\Omega_2\Leftrightarrow\gamma+\alpha_1\leq\alpha_2</math> и
:<math>\Omega_2\subseteq\Omega_1\Leftrightarrow\gamma+\alpha_2\leq\alpha_1</math>.
Поэтому:
:<math>\gamma+\alpha_1\leq\alpha_2\Rightarrow\Omega_{12}\equiv\Omega_2</math>, иначе
:<math>\gamma+\alpha_2\leq\alpha_1\Rightarrow\Omega_{12}\equiv\Omega_1</math>.
Далее по тексту предполагается, что <math>\Omega_1\nsubseteq\Omega_2\land\Omega_2\nsubseteq\Omega_1</math>. Следовательно <math>\gamma\ne0</math>.


Существует три случая.
Существует три случая.


[[Файл:encompassing_aperture_t_c1_par_c2.svg|thumb|
[[Файл:encompassing_aperture_t_c1_par_c2.svg|thumb|
Объединение секторов, у которых <math>\vec{c}_1\|\vec{c}_2</math>.|400px]]
Объединение секторов, у которых <math>\vec{c}_1\|\vec{c}_2</math> (''первый случай'').|400px]]


Рассмотрим '''первый случай''', когда <math>\vec{c}_1\|\vec{c}_2</math>. Поскольку длины всех векторов равны единице, <math>\vec{c}_2=-\vec{c}_1</math>, а количество плоскостей, которым одновременно могут принадлежать <math>\vec{c}_1</math> и <math>\vec{c}_2</math> бесконечно, вследствие чего количество возможных секторов минимальной площади, объединяющих <math>\Omega_1</math> и <math>\Omega_2</math>, также бесконечно и зависит от того на какой из плоскостей будут принадлежать ''выбранные'' <math>\vec{c'}_1</math> и <math>\vec{c'}_2</math>; и этот выбор будет сводится к выбору диаметральной плоскости, проходящей через <math>\vec{c}_1</math>.
Рассмотрим '''первый случай''', когда <math>\vec{c}_1\|\vec{c}_2</math> (то есть <math>\cos \gamma\equiv-1</math>). Поскольку длины всех векторов равны единице, <math>\vec{c}_2=-\vec{c}_1</math>, а количество плоскостей, которым одновременно могут принадлежать <math>\vec{c}_1</math> и <math>\vec{c}_2</math> бесконечно, вследствие чего количество возможных секторов минимальной площади, объединяющих <math>\Omega_1</math> и <math>\Omega_2</math>, также бесконечно и зависит от того на какой из плоскостей будут принадлежать ''выбранные'' <math>\vec{c'}_1</math> и <math>\vec{c'}_2</math>; и этот выбор будет сводится к выбору диаметральной плоскости, проходящей через <math>\vec{c}_1</math>.


Этот выбор можно сделать, если задать произвольный вектор <math>\vec{c}_n</math>, перпендикулярный <math>\vec{c}_1</math>.
Этот выбор можно сделать, если задать произвольный вектор <math>\vec{c}_n</math>, перпендикулярный <math>\vec{c}_1</math>.
Строка 24: Строка 36:
В описываемой реализации
В описываемой реализации
:<math>\vec{c}_n=\left[\begin{matrix}
:<math>\vec{c}_n=\left[\begin{matrix}
\begin{pmatrix}1 & 0 & 0\end{pmatrix}^T,\Leftrightarrow \vec{c}_1.x\equiv 0 \\
\begin{pmatrix}1 & 0 & 0\end{pmatrix}^T\Leftrightarrow \vec{c}_{1x}\equiv 0 \\
\begin{pmatrix}-\frac{\vec{c}_1.y}{\vec{c}_1.x} & 1 & 0\end{pmatrix}^T,\Leftrightarrow \vec{c}_1.x\equiv 0
\frac{\begin{pmatrix}-\frac{\vec{c}_{1y}}{\vec{c}_{1x}} & 1 & 0\end{pmatrix}^T}{\left|\begin{pmatrix}-\frac{\vec{c}_{1y}}{\vec{c}_{1x}} & 1 & 0\end{pmatrix}^T\right|}\Leftrightarrow \vec{c}_{1x}\ne 0
\end{matrix}\right.</math>.
\end{matrix}\right.</math>.


Строка 32: Строка 44:
Для нахождения вектора <math>\vec{c'}_{12}</math> достаточно выразить его в базисе <math>\left\langle\vec{c}_1,\vec{c}_n\right\rangle</math> и осуществить переход к мировой системе координат входной модели. Как видно из рисунка, в указанном базисе вектор <math>\vec{c'}_{12}</math> имеет координаты  
Для нахождения вектора <math>\vec{c'}_{12}</math> достаточно выразить его в базисе <math>\left\langle\vec{c}_1,\vec{c}_n\right\rangle</math> и осуществить переход к мировой системе координат входной модели. Как видно из рисунка, в указанном базисе вектор <math>\vec{c'}_{12}</math> имеет координаты  
:<math>\begin{pmatrix}
:<math>\begin{pmatrix}
\left|\vec{c}_1\right|\cdot\textrm{cos}\left(\frac{\pi}{2} - \beta\right)\textrm{cos}\left(\frac{\pi}{2}-\left(\alpha_1 + \beta\right)\right) \\
\left|\vec{c}_1\right|\cdot\cos \left(\frac{\pi}{2} - \beta\right)\cos \left(\frac{\pi}{2}-\left(\alpha_1 + \beta\right)\right) \\
\left|\vec{c}_1\right|\cdot\textrm{cos}\left(\frac{\pi}{2} - \beta\right)\textrm{sin}\left(\frac{\pi}{2}-\left(\alpha_1 + \beta\right)\right)
\left|\vec{c}_1\right|\cdot\cos \left(\frac{\pi}{2} - \beta\right)\sin \left(\frac{\pi}{2}-\left(\alpha_1 + \beta\right)\right)
\end{pmatrix} = \begin{pmatrix}
\end{pmatrix} = \begin{pmatrix}
\textrm{cos}\left(\frac{\pi}{2} - \beta\right)\textrm{cos}\left(\frac{\pi}{2}-\left(\alpha_1 + \beta\right)\right) \\
\cos \left(\frac{\pi}{2} - \beta\right)\cos \left(\frac{\pi}{2}-\left(\alpha_1 + \beta\right)\right) \\
\textrm{cos}\left(\frac{\pi}{2} - \beta\right)\textrm{sin}\left(\frac{\pi}{2}-\left(\alpha_1 + \beta\right)\right)
\cos \left(\frac{\pi}{2} - \beta\right)\sin \left(\frac{\pi}{2}-\left(\alpha_1 + \beta\right)\right)
\end{pmatrix}</math>,
\end{pmatrix}</math>,


Строка 44: Строка 56:
:<math>\vec{c'}_{12}=\begin{pmatrix}\vec{c}_1 & \vec{c}_n\end{pmatrix}
:<math>\vec{c'}_{12}=\begin{pmatrix}\vec{c}_1 & \vec{c}_n\end{pmatrix}
\begin{pmatrix}
\begin{pmatrix}
\textrm{cos}\left(\frac{\pi}{2} - \frac{\alpha_1 + \alpha_2}{2}\right)\textrm{cos}\left(\frac{\pi}{2}+\frac{\alpha_1 - \alpha_2}{2}\right) \\
\cos \left(\frac{\pi}{2} - \frac{\alpha_1 + \alpha_2}{2}\right)\cos \left(\frac{\pi}{2}+\frac{\alpha_1 - \alpha_2}{2}\right) \\
\textrm{cos}\left(\frac{\pi}{2} - \frac{\alpha_1 + \alpha_2}{2}\right)\textrm{sin}\left(\frac{\pi}{2}+\frac{\alpha_1 - \alpha_2}{2}\right)
\cos \left(\frac{\pi}{2} - \frac{\alpha_1 + \alpha_2}{2}\right)\sin \left(\frac{\pi}{2}+\frac{\alpha_1 - \alpha_2}{2}\right)
\end{pmatrix} = \textrm{cos}\left(\frac{\pi}{2} - \frac{\alpha_1 + \alpha_2}{2}\right)\begin{pmatrix}\vec{c}_1 & \vec{c}_n\end{pmatrix}
\end{pmatrix} = \cos \left(\frac{\pi}{2} - \frac{\alpha_1 + \alpha_2}{2}\right)\begin{pmatrix}\vec{c}_1 & \vec{c}_n\end{pmatrix}
\begin{pmatrix}
\begin{pmatrix}
-\textrm{sin}\frac{\alpha_1 - \alpha_2}{2} \\
-\sin \frac{\alpha_1 - \alpha_2}{2} \\
\textrm{cos}\frac{\alpha_1 - \alpha_2}{2}
\cos \frac{\alpha_1 - \alpha_2}{2}
\end{pmatrix}</math>.
\end{pmatrix}</math>.


Пусть <math>\tau=-\textrm{cos}\left(\frac{\pi}{2} - \frac{\alpha_1 + \alpha_2}{2}\right)</math> и  
Пусть <math>\tau=-\cos \left(\frac{\pi}{2} - \frac{\alpha_1 + \alpha_2}{2}\right)</math> и <math>\vec{c''}_{12} = \begin{pmatrix}\vec{c}_1 & \vec{c}_n\end{pmatrix}
:<math>\vec{c''}_{12} = \begin{pmatrix}
\begin{pmatrix}
\textrm{sin}\frac{\alpha_1 - \alpha_2}{2} \\
\sin \frac{\alpha_1 - \alpha_2}{2} \\
\textrm{cos}\frac{\alpha_1 - \alpha_2}{2}
\cos \frac{\alpha_1 - \alpha_2}{2}
\end{pmatrix}</math>.
\end{pmatrix}</math>.


Строка 64: Строка 76:


а ангулярный радиус будет равен
а ангулярный радиус будет равен
:<math>\alpha_{12}=\pi - \beta = \frac{\pi}{2}+\frac{\alpha_1 + \alpha_2}{2}</math>.
:<math>\alpha_{12}=\pi - \beta = \frac{\pi + \alpha_1 + \alpha_2}{2}</math>.
 
Во '''втором случае''' <math>\vec{c}_1\nparallel\vec{c}_2</math>, однако <math>\vec{c'}_1\|\vec{c'}_2</math> (то есть <math>\alpha_1 + \gamma + \alpha_2 \equiv \pi</math>).
 
'''Лемма'''
:<math>0\le\alpha_1,\alpha_2<\frac{\pi}{2}</math>.
 
Действительно, допустим <math>\alpha_1\ge\frac{\pi}{2}\Rightarrow\pi-\gamma-\alpha_2\ge\frac{\pi}{2}\Rightarrow\frac{\pi}{2}\ge\gamma+\alpha_2\Rightarrow\alpha_1\ge\gamma+\alpha_2\Rightarrow\Omega_2\subseteq\Omega_1</math>.
 
''Противоречие'' ограничению, приведенному выше.
 
Аналогично доказывается ограничение <math>0\le\alpha_2<\frac{\pi}{2}</math>.
 
'''Лемма'''
<math>\alpha_1</math> и <math>\alpha_2</math> не могут быть одновременно равны нулю. Иначе имел бы место случай 1 выше.
 
'''Следствие'''
:<math>0<\alpha_1+\alpha_2<\pi</math>.
 
 
Поскольку один из ангулярных радиусов обязательно ненулевой, примем ограничение <math>\alpha_1>0</math> (тогда <math>\alpha_2\ge 0</math>).
 
[[Файл:encompassing_aperture_t_c1s_par_c2s.svg|thumb|
Объединение секторов, у которых <math>\vec{c'}_1\|\vec{c'}_2</math> (''второй случай'').|400px]]
Решение задачи объединения сводится к поиску вектора <math>\vec{c}_{12}</math>, перпендикулярного <math>\vec{c'}_1</math> (и <math>\vec{c'}_2</math>), лежащего в плоскости <math>\vec{c}_1</math> и <math>\vec{c}_2</math>, имеющего острый угол одновременно с <math>\vec{c}_1</math> и с <math>\vec{c}_2</math> и нормализованного.
 
Поскольку вектора <math>\vec{c}_1</math> и <math>\vec{c}_2</math> линейно-независимы, их можно использовать в качестве базиса для поиска вектора, сонаправленного с <math>\vec{c}_{12}</math>, следующим образом.
 
Опустим перпендикуляр от конца одного из векторов, например <math>\vec{c}_1</math>, на вектор <math>\vec{c}_{12}</math>, перперндикулярный <math>\vec{c'}_1</math> и образующий острый угол с <math>\vec{c}_1</math>. Обозначим вектор, связанный с направленным отрезком, который исходит от центра сферы к точке пересечения <math>\vec{c}_{12}</math> и проведенного перпендикуляра, как <math>\vec{c'}_{12}</math>. Такой вектор очевидно будет сонаправлен с <math>\vec{c}_{12}</math>, а его длина будет равна
:<math>\left|\vec{c'}_{12}\right|=\left|\vec{c}_1\right|\sin \alpha_1=\sin \alpha_1</math>;
:<math>\vec{c}_{12} = \tau\vec{c'}_{12}</math>.
 
Обозначим как <math>\vec{c'}_{12,\left\langle\vec{c}_1,\vec{c}_2\right\rangle,x}</math> и <math>\vec{c'}_{12,\left\langle\vec{c}_1,\vec{c}_2\right\rangle,y}</math> соответственно проекции вектора <math>\vec{c'}_{12}</math> на <math>\vec{c}_1</math> и <math>\vec{c}_2</math> а равно координаты вектора <math>\vec{c'}_{12}</math> в базисе <math>\left\langle\vec{c}_1,\vec{c}_2\right\rangle</math>. Из теоремы синусов следует, что
:<math>\frac{\sin \left(\alpha_1+\alpha_2\right)}{\left|\vec{c'}_{12}\right|}=
\frac{\sin \left(\alpha_1+\alpha_2\right)}{\sin \alpha_1}=
\frac{\sin \left(\frac{\pi}{2} - \alpha_2\right)}{\left|\vec{c'}_{12,\left\langle\vec{c}_1,\vec{c}_2\right\rangle,x}\right|}=
\frac{\cos \alpha_2}{\left|\vec{c'}_{12,\left\langle\vec{c}_1,\vec{c}_2\right\rangle,x}\right|}=
\frac{\sin \left(\frac{\pi}{2} - \alpha_1\right)}{\left|\vec{c'}_{12,\left\langle\vec{c}_1,\vec{c}_2\right\rangle,y}\right|}=
\frac{\cos \alpha_1}{\left|\vec{c'}_{12,\left\langle\vec{c}_1,\vec{c}_2\right\rangle,y}\right|}</math>.
 
Тогда в базисе <math>\left\langle\vec{c}_1,\vec{c}_2\right\rangle</math> вектор <math>\vec{c'}_{12}</math> будет равен:
:<math>\vec{c'}_{12}=\frac{\sin \alpha_1}{\sin \left(\alpha_1+\alpha_2\right)}\begin{pmatrix}\vec{c}_1 & \vec{c}_2\end{pmatrix}
\begin{pmatrix}
\cos\alpha_2 \\
\cos\alpha_1
\end{pmatrix}</math>.
 
Пусть <math>\tau'=\frac{\sin \left(\alpha_1+\alpha_2\right)}{\sin \alpha_1}</math>, и <math>\vec{c''}_{12}=\tau'\vec{c'}_{12}=\begin{pmatrix}\vec{c}_1 & \vec{c}_2\end{pmatrix}
\begin{pmatrix}
\cos\alpha_2 \\
\cos\alpha_1
\end{pmatrix}</math>.
 
Таким образом, во втором случае <math>\vec{c}_{12}=\frac{\tau'\vec{c''}_{12}}{\left|\tau'\vec{c''}_{12}\right|}=\frac{\vec{c''}_{12}}{\left|\vec{c''}_{12}\right|}</math>,
<math>\alpha_{12}=\frac{\pi}{2}</math>.
 
В '''третьем случае''' предполагается, что <math>\vec{c}_1\nparallel\vec{c}_2</math>, и <math>\vec{c'}_1\nparallel\vec{c'}_2</math>.
 
[[Файл:encompassing_aperture_t_unify_extra.svg|thumb|
Объединение секторов, у которых <math>\vec{c}_1\nparallel\vec{c}_2</math>, и <math>\vec{c'}_1\nparallel\vec{c'}_2</math> (''третий случай'').|400px]]
 
Пусть <math>\delta=\alpha_1+\gamma+\alpha_2</math>. Здесь <math>\delta>0</math> и <math>\delta\ne\pi</math>, поскольку это - ситуации, описанные выше.
 
Тогда сектор <math>\Omega_{12}</math> может быть задан парой <math>\vec{c}_{12}=\left(-1\right)^s \tau\left(\vec{c'}_1+\vec{c'}_2\right)</math> и <math>\alpha_{12}=\frac{\delta}{2}</math>. <math>\tau</math> - скаляр, нормализующий <math>\vec{c}_{12}</math>. Знак вектора-направления на центральную точку определяется тем, является ли угол <math>\delta</math> выпуклым, т.е.
:<math>s=\left[\begin{matrix}
0\Leftrightarrow\delta<\pi \\
1\Leftrightarrow\delta>\pi
\end{matrix}\right.</math>.
 
Тогда для окончательного решения необходимо найти <math>\vec{c'}_1</math> и <math>\vec{c'}_2</math>. Для этого выразим <math>\vec{c'}_1</math> в базисе <math>\vec{c}_1</math> и <math>\vec{c'}_2</math> - в базисе <math>\vec{c}_2</math>.
 
Рассмотрим вектора <math>\vec{c}_1</math> и <math>\vec{c'}_1</math> и угол <math>\alpha_1</math>. Если <math>\alpha_1\equiv 0</math>, то <math>\vec{c'}_1=\vec{c}_1</math>, поэтому в базисе <math>\left\langle\vec{c}_1,\vec{c}_2\right\rangle</math> он будет равен <math>\begin{pmatrix}1 & 0 & 0\end{pmatrix}^T</math>.
 
Далее рассмотрим случай, когда <math>\alpha_1\ne 0</math>. Направленные отрезки <math>\vec{c}_1</math>, <math>\vec{c'}_1</math> и <math>\vec{c}_2</math>, с началом в точке пересечения <math>\vec{c'}_1</math> и сферы до точки пересечения с <math>\vec{c}_1</math>, будут образовывать треугольник, стороны которого соотносятся друг с другом как
:<math>\frac{\left|\vec{c'}_{1}\right|}{\sin\gamma}=\frac{1}{\sin\gamma}=\frac{\vec{c'}_{1x}}{\sin\left(\pi-\alpha_1-\gamma\right)}=\frac{\vec{c'}_{1x}}{\sin\left(\alpha_1+\gamma\right)}=\frac{\vec{c'}_{1y}}{\sin\alpha_1}</math>.
 
Поэтому <math>\vec{c'}_1=\frac{1}{\sin\gamma}\begin{pmatrix}\vec{c}_1 & \vec{c}_2\end{pmatrix}\begin{pmatrix}\sin\left(\alpha_1 + \gamma\right) \\ \sin\alpha_1\end{pmatrix}</math>. Заметим, что поскольку <math>\gamma>0</math> это равенство выполняется также и для случая <math>\alpha_1\equiv 0</math>.
 
Также отметим, что аналогичные рассуждения справедливы и для <math>\vec{c'}_2</math>.
 
Далее, пусть <math>\tau'=\frac{1}{\sin\gamma}</math>, и
:<math>\vec{c''}_1=\begin{pmatrix}\vec{c}_1 & \vec{c}_2\end{pmatrix}\begin{pmatrix}\sin\left(\alpha_1 + \gamma\right) \\ \sin\alpha_1\end{pmatrix}</math>, и
:<math>\vec{c''}_2\begin{pmatrix}\vec{c}_1 & \vec{c}_2\end{pmatrix}\begin{pmatrix}\sin\alpha_2 \\ \sin\left(\alpha_2 + \gamma\right)\end{pmatrix}</math>.


Во '''втором случае''' <math>\vec{c}_1\nparallel\vec\vec{c}_2</math>, однако <math>\vec{c'}_1\|\vec{c'}_2</math>.
Тогда <math>\vec{c'}_1=\tau'\vec{c''}_1</math> и <math>\vec{c'}_2=\tau'\vec{c''}_2</math>, и
:<math>\vec{c}_{12}=\left(-1\right)^s \frac{\tau'\left(\vec{c''}_1+\vec{c''}_2\right)}{\left|\tau'\left(\vec{c''}_1+\vec{c''}_2\right)\right|}=\left(-1\right)^s \frac{\left(\vec{c''}_1+\vec{c''}_2\right)}{\left|\left(\vec{c''}_1+\vec{c''}_2\right)\right|}</math>, и
:<math>\alpha_{12}=\frac{\delta}{2}</math>.

Текущая версия на 22:10, 1 декабря 2018

Пусть объединяются два сектора сферы, релизуемые классом классом encompassing_aperture_t - и , где - вектор направления на центральную точку -го сектора (возвращаемый методом encompassing_aperture_t::central_point), а - соответствующий ангулярный радиус (возвращаемый методом encompassing_aperture_t::radius). Сектор, у которого ангулярный радиус равен охватывает сферу полностью независимо от вектора .

В результате объединения создается новый сектор .

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

Далее рассматривается случай, в котором .

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

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

Пусть далее , где - угол между и .

Два особых случая:

и
.

Поэтому:

, иначе
.

Далее по тексту предполагается, что . Следовательно .

Существует три случая.

Объединение секторов, у которых (первый случай).

Рассмотрим первый случай, когда (то есть ). Поскольку длины всех векторов равны единице, , а количество плоскостей, которым одновременно могут принадлежать и бесконечно, вследствие чего количество возможных секторов минимальной площади, объединяющих и , также бесконечно и зависит от того на какой из плоскостей будут принадлежать выбранные и ; и этот выбор будет сводится к выбору диаметральной плоскости, проходящей через .

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

В описываемой реализации

.

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

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

,

причем .

Тогда в мировых координатах

.

Пусть и .

Тогда .

Отсюда

,

а ангулярный радиус будет равен

.

Во втором случае , однако (то есть ).

Лемма

.

Действительно, допустим .

Противоречие ограничению, приведенному выше.

Аналогично доказывается ограничение .

Лемма и не могут быть одновременно равны нулю. Иначе имел бы место случай 1 выше.

Следствие

.


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

Объединение секторов, у которых (второй случай).

Решение задачи объединения сводится к поиску вектора , перпендикулярного ), лежащего в плоскости и , имеющего острый угол одновременно с и с и нормализованного.

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

Опустим перпендикуляр от конца одного из векторов, например , на вектор , перперндикулярный и образующий острый угол с . Обозначим вектор, связанный с направленным отрезком, который исходит от центра сферы к точке пересечения и проведенного перпендикуляра, как . Такой вектор очевидно будет сонаправлен с , а его длина будет равна

;
.

Обозначим как и соответственно проекции вектора на и а равно координаты вектора в базисе . Из теоремы синусов следует, что

.

Тогда в базисе вектор будет равен:

.

Пусть , и .

Таким образом, во втором случае , .

В третьем случае предполагается, что , и .

Объединение секторов, у которых , и (третий случай).

Пусть . Здесь и , поскольку это - ситуации, описанные выше.

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

.

Тогда для окончательного решения необходимо найти и . Для этого выразим в базисе и - в базисе .

Рассмотрим вектора и и угол . Если , то , поэтому в базисе он будет равен .

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

.

Поэтому . Заметим, что поскольку это равенство выполняется также и для случая .

Также отметим, что аналогичные рассуждения справедливы и для .

Далее, пусть , и

, и
.

Тогда и , и

, и
.