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