Если вы имеете дело с миллионами полигонов, вам нужно какое-то разделение пространства, или оно будет медленным, независимо от того, насколько оптимизирована ваша функция проверки результатов или сколько потоков работает при решении вашего запроса.
Какое разделение пространства? зависит от:
- 2D? 3D?
- Установлен ли ваш полигон статическим? Если нет, часто ли это меняет?
- Какая просьба вы делаете на этом наборе?
- Что это за полигон? Треугольник? Выпуклые? Вогнутые? Сложный? С отверстиями?
Нам нужна дополнительная информация, чтобы помочь вам.
EDIT
Вот простая схема пространственного разделения.
Предположим, что на вашем двумерном пространстве есть декартова сетка с заданным шагом.
При добавлении многоугольника:
- вычислит его ограничительная рамку
- Найти все ячейки сетки, которые пересекаются с ограничивающим параллелепипедом
- Для каждой ячейки, добавьте строку в специальной таблице.
таблица выглядит следующим образом: cell_x
, cell_y
, polygon_id
. Добавьте соответствующие индексы (по крайней мере cell_x
и cell_y
)
Конечно, вы хотите, чтобы выбрать шаг сетки так, большинство полигонов лежали в менее чем 10 клеток, или же ваша ячейка таблица быстро становится огромной.
Теперь легко найти многоугольники в данной точке:
- Compute, в котором клетка ваша точка принадлежит
- Получить все полигоны, связанные с этой ячейкой
- Для каждого полигона, используйте hit- контрольная функция
Это решение далеко не оптимально, но легко реализуется.
Как насчет написания вашего алгоритма в CUDA и его запуска на GPU;)? – paulsm4