Выловил глюк, теперь добавление четвёртой точки работает во всех случаях. Осталось доделать заполнение структур и проверить добавление ещё точек по одной. Однако мне не нравится как соединяются сайты:
Это ни на что не влияет, но всё-таки хотелось бы придумать способ узнать, что сайты 3 и 4 надо соединить не по кратчайшему пути, а по наидлиннейшему. При этом не хотелось бы проверять наличие пересечения ребра 3-4 триангуляции со всеми остальными рёбрами. Вообще, во всех таких случаях
соответствующее ребро диаграммы лежит на другой стороне сферы. Как бы это утверждение математически формализовать?
-- 07.01.2018, 22:15 --Можно было бы воспользоваться проверкой расстояний. То есть считать, что точка C лежит вне отрезка AB, если
. Однако, если точка C лежит внутри отрезка AB, то по идее должно выполнятся равенство
, которое является единственной альтернативой предыдущему неравенству.
Перемудрил я с проверкой расстояний на плоскости. Если известно, что точки A, B и C лежат на одной прямой и необходимо определить, принадлежит ли точка C отрезку AB, то для этого надо проверить выполнение двух неравенств:
и
. Если оба неравенства выполняются, то точка лежит внутри отрезка, в противном случае — не лежит.
Кроме того, можно поступить чуток иначе, а именно проверить только первое неравенство
и проверить, что векторы
и
сонаправлены (например, что скалярное произведение больше нуля).
Первый подход на сферу (вернее даже на окружность), к сожалению, не переносим. Всё потому что между двумя точками на окружности есть два расстояния. Поэтому в ситуации на рисунке:
для обоих точек
выполняются неравенства
и
вне зависимости от того, принадлежность какой дуге AB — большей или меньшей — для точки С мы проверяем.
На сфере в этом плане вообще всё сложнее: для диаметрально противоположных точек A и B существует куча разных отрезков, принадлежность которым можно проверять. Впрочем, если задано, что точка C лежит на большой окружности (сферической прямой), проходящей через точки A и B, то вопрос только в том, как указать нужную половинку этой окружности.
Итак, возникла следующая задача. На сфере имеются три точки, например, A, B и C, лежащие на одной сферической прямой (большой окружности). Необходимо определить, лежит ли точка C внутри отрезка AB.
Решение надо начинать с правильного задания сферического отрезка. Я предлагаю его задавать специальной точкой —
центром сферической прямой (большой окружности). Для случая, когда две точки A и B не являются диаметрально противоположными этот центр прямой находится нормированием векторного произведения радиус-векторов точек A и B. Здесь подразумевается, что сфера единичного радиуса погружена в трёхмерное пространство и её центр совпадает с началом координат. Эта точка точка остаётся инвариантной при усечении, удлинении сферического отрезка, а так же при его переносе параллельно самому себе, если это так можно назвать. Своего рода направляющий радиус-вектор сферической прямой.
Следующей точкой, задающей сферический отрезок будет, естественно, его начало. С этим всё понятно. И последней задающей величиной является длина отрезка L. Она должна быть положительна и меньше
. Отрезок откладывается вдоль своей окружности против часовой стрелки, если наблюдать из центра окружности. Поэтому, например, справедливо следующее равенство:
. Такой подход весьма универсален, поскольку он позволяет однозначно задать любые сферические отрезки которые только можно себе вообразить, в том числе, длина которых больше кратчайшего расстояния между концами отрезка.
Теперь решение задачи о принадлежности. Последуем второму подходу, сделанному на плоскости. Проверим неравенство
, а так же проверим, что точка C откладывается в ту же сторону, что и точка B. Для этого вектор
должен быть сонаправлен с радиус-вектором центра окружности. Здесь, правда, есть тонкость, если мы допускаем возможность отрезков с длиной большей
. В этом случае, если
, то надо проверять
, а если же
, то
. В случае
точки A и C диаметрально противоположны, и точка C лежит на любой окружности, проходящей через точку A. Это, правда, в теории. На практике погрешности округления в такой ситуации приведут к проблемам. Но в целом задача решена.
В моём случае, мне надо из двух диаметрально противоположных точек выбрать ту, которая принадлежит отрезку. Причём его длина не больше
, и гарантировано, что такая точка одна и только одна. Поэтому сравнивать расстояния не требуется, только сонаправленность векторного произведения и радиус-вектора центра окружности.