Я пишу программу, которая реализует SCVT (сферическое центроидное тесселяция Вороного). Я начинаю с набора точек, распределенных по единичной сфере (у меня есть опция для случайных точек или спирали равной площади). Будет от нескольких сотен до, может быть, 64 тыс. Баллов.
Затем мне нужно произвести несколько миллионов точек случайной выборки, для каждой выборки найти ближайшую точку в наборе и использовать ее для расчета «веса» для этой точки. (Этот вес, возможно, придется искать из другого сферического набора, но этот набор будет оставаться статическим для любого заданного запуска алгоритма.)
Затем я перемещаю исходные точки в вычисленные точки и повторяю процесс, вероятно, 10 или 20 раз. Это даст мне центры плиток Вороного для последующего использования.
Позже мне нужно будет найти ближайшего соседа данной точки, чтобы увидеть, на какой плитке нажал пользователь. Это легко решается в рамках вышеупомянутой проблемы, и в любом случае не нужно быть слишком быстрым. Часть, в которой я нуждаюсь, - это миллионы ближайших соседей в сфере юнитов. Есть указатели?
О, я использую координаты x, y, z, но это не в камне. Похоже, что это упростит вещи. Я также использую C, поскольку я наиболее знаком с ним, но также не привязан к этому выбору. :)
Я подумал об использовании спиральной модели для точек выборки, поскольку это дает мне, по крайней мере, найденную соседку последней точки в качестве хорошей начальной точки для следующего поиска. Но если я сделаю это, похоже, что поиск по дереву станет бесполезным.
редактирование:
[Извините, мне показалось, что с заголовком и тегами все понятно. Я могу генерировать случайные точки легко. Вопрос в поиске ближайшего соседа. Какой эффективный алгоритм, когда все точки находятся на единичной сфере?]