Computational Geometry in C, Joseph O'Rourke
Ещё раз спасибо! Дочитал до главы про диаграммы Вороного и понял, что это именно то, что мне нужно на первом этапе решения поставленной себе задачи. Правда диаграмму надо строить на сфере... И уметь эффективно перестраивать её при смещении только одной точки.
-- 30.12.2017, 17:32 --хотя в статье в Википедии, если мне не изменяет память, затрагивается такой важный вопрос, как повышение точности расчёта в случае, когда точки близки друг другу или в каком-либо другом неприятном случае). Только что решил задачу нахождения точки, равноудалённой от заданных трёх (как оказалось таких точек даже две
К сожалению, не нашёл нужной формулы, поэтому пришлось
изобретать велосипед решать самому. Опишу, то что напридумывал, вдруг кого заинтересует/кто-то предложит более разумный вариант.
Расстояние на сфере между двумя точками можно рассчитать в лоб через длину ходы, соединяющей эти точки. Получится такая формула:
Если чуть-чуть повозиться с формулами половинного/двойного угла, то её можно привести к такому виду:
К сожалению, обе эти формулы очень плохо работают, когда точки близки друг к другу. В первом случае из единицы вычитается число, отличающееся от неё на величину, квадратичную по порядку малости. В результате безумные погрешности округления для ещё разумных исходных значений. Вторая формула ничем не лучше: вычисляется арккосинус величины, так же отличающейся от единицы на квадратичную по порядку малости. Поэтому необходимо избавиться от этой разности единицы и близкого к ней значения. Это можно сделать так:
Что приводит к формуле:
Эта формула уже прекрасно работает для близких точек, однако, проблема переместилась на другой конец интервала: формула очень плохо работает, когда точки лежат почти диаметрально противоположно (арксинус числа близкого к единице). И тут мне стало понятно, что простого решения я найти не смогу. Но можно подойти к задаче более обще. Пусть
Тогда мне надо разрешить уравнение
относительно икса как можно точнее. Для малых значений аргумента и результата лучше использовать такую формулу:
А для величин порядка единицы решать уравнение в лоб, вычисляя арккосинус. Однако, очень неудобно пользоваться одной формулой для одного интервала, а другой — для другого. Лучшее, что я смог придумать — это объединить их в одну, используя арктангенс двух аргументов:
Получился тот ещё крокодил.