Изменения

Перейти к: навигация, поиск

Пересечение отрезков на сфере

901 байт добавлено, 19:31, 4 сентября 2022
м
rollbackEdits.php mass rollback
Дано два отрезка на сфере. Необходимо узнать пересекаются ли они.
== Алгоритм == 1) Проверим отрезки на то что они лежат в одной плоскости, если лежат перейдем к плоскости и разберем случаи, иначе перейдем к шагу 2. 2) Построим из концов отрезков тетраэдр. 3) Проверим центр сферы на принадлежность тетраэдру. Если принадлежит то отрезки не пересекаются, иначе перейдем к шагу 4. 4) Проверим с помощью поворота отрезки на пересечение. == Проверка на пересечение двух отрезков на сфере==
Сопоставим каждой точке на сфере луч, исходящий из центра сфера сферы(точка <tex>O</tex>) и проходящий через эту точку. Тогда лучи сопоставляемые двум точкам будут образовывать плоскость. Необходимо научиться проверять лежит данная ли точка в плоскости образованной двумя другими точками. Итак у нас есть точки <tex>aC</tex> и в плоскости образованной лучами точек <tex>bA</tex> образующие плоскость, также есть точка и <tex>cB</tex>. Необходимо узнать расположение этой точки относительно плоскости. Вспомним о повороте. Необходимо посчитать определитель матрицы поворота и сравнить его знак с нулем.
[[Файл:Sphere1Sphere_1.png|right|1000|thumb|Плоскость, образованная центром сферы и точками <tex>A </tex> и <tex>B</tex>. Необходимо определить взаимное расположение плоскости и точки С]]
Рассмотрим три случая:
* <tex>sign(|A|) > 0</tex> тогда точка <tex>c</tex> лежит над плоскостью, образованной точками <tex>aO</tex>, <tex>A</tex> и <tex>bB</tex>.* <tex>sign(|A|) < 0</tex> тогда точка <tex>c</tex> лежит под плоскостью, образованной точками <tex>aO</tex>, <tex>A</tex> и <tex>bB</tex>.* <tex>sign(|A|) = 0</tex> тогда точка <tex>c</tex> лежит на плоскости, образованной точками <tex>aO</tex>, <tex>A</tex> и <tex>bB</tex>. 
|statement=Если два отрезка на сфере пересекаются, то все их четыре точки находятся в одной полусфере.
|proof=
[[Файл:Sphere3Sphere_4.jpgpng|right|1000|thumb|Плоскость ОАХ]]Пусть есть отрезки: <tex>AB</tex> и <tex>CD</tex>. Точка пересечения <tex>X</tex>. Центр сферы - начало координат <tex>O</tex>.Найдем нужную полусферу. Это будет полусфера от окружности точек плоскости, образованной точками <tex>O</tex>, <tex>A</tex> и <tex>C</tex>, ориентированная так, чтобы содержать <tex>X</tex>.Проведем плоскость <tex>OAX</tex>, пересечем ее со сферой. На полученной окружности возьмем точку <tex>A'</tex> - диаметрально противоположную точке <tex>A</tex>. Точка <tex>B</tex> находится в нашей полусфере, потому что она находится "ближе" точки <tex>A'</tex>. Если бы она была дальше точки <tex>A'</tex>, то мы бы провели отрезок <tex>AB</tex> через другую половину сферы, и соответственно, точка <tex>X</tex> была бы не в выбранной полусфериполусфере.
Далее повторим рассуждения для точек <tex>C</tex> и <tex>D</tex>.
}}
[[Файл:Sphere2.jpg|right|1000|thumb|Тетраэдр полученный из концов отрезков. В данном случае грань ADC отсекает его от центра сферы.]]
Проверим лежат ли точки в одной плоскости, если лежат то перейдем к проведем эту плоскость, пересечение сферы и этой плоскостиэто окружность, на которой лежат 4 точки(начала и проверка на пересечение прямых переходит в разбор случаевконцы отрезков).Иначе рассмотрим следующий алгоритмДалее необходимо выбрать из 2ух отрезков любой, посчитать поворот его концов относительно центра окружности, а дальше сравнить поворот оставшихся точек, если хотя бы одна точка из второго отрезка попадает в диапазон значений между концами выбранного нами отрезка, то прямые пересекаются, иначе необходимо взять другой отрезок и проверить это же утверждение для него(так как 1ый взятый нами отрезок мог содержаться во втором), в случае если оба случая не дали положительного результата - отрезки не пересекаются.
Соединив Иначе, если точки не лежат в одной плоскости, рассмотрим следующий алгоритм. Соединим концы отрезков, получим результатом будет тетрэдр.
{{Утверждение
Для того, чтобы найти такую грань, необходимо для каждой грани тетраэдра проверить поворот противоположной точки и центра окружности, и если знаки определителей матриц поворота оказались разные, то такая грань найдена.
Для того, чтобы проверить грань существование грани, отсекающей тетраэдр <tex>PABC</tex> от центра сферы, необходимо посчитать определитель матрицы поворота для четырех точек. 
<tex> A = </tex>
\end{array}\right)
</tex>
 
 
Где <tex>A</tex>, <tex>B</tex>, <tex>C</tex> - точки задающие плоскость, <tex>P</tex> точка для которой надо вычислить поворот.
где вместо <tex>P</tex> необходимо поочередно подставить <tex>C</tex> и <tex>D</tex>. И если хотя бы для одной точки <tex>V > 0</tex>, то отрезки пересекаются и точка пересечения лежит на <tex>AB</tex>.
 
== Алгоритм ==
 
1) Проверим отрезки на то что они лежат в одной плоскости, если лежат перейдем к плоскости и разберем случаи, иначе перейдем к шагу 2.
 
2) Построим из концов отрезков тетраэдр.
 
3) Проверим центр сферы на принадлежность тетраэдру. Если принадлежит то отрезки не пересекаются, иначе перейдем к шагу 4.
 
4) Подставим координаты точек в соотношение написанное выше и сравним результат с <tex>0</tex>. Если хотя бы для одной точки результат <tex>> 0</tex> то отрезки пересекаются, иначе нет.
1632
правки

Навигация