Я сомневаюсь, что есть лучшее решение, чем вычисление расстояния между красным и каждым синим и сортировка их по длине.
Что касается сортировки, обычно QuickSort трудно превзойти по производительности (оптимизированный, который отключает рекурсию, если размер становится меньше 7 элементов, и переключается на что-то вроде InsertionSort, возможно, ShellSort).
Таким образом, я предполагаю, что вопрос в том, как быстро вычислить расстояние между двумя полигонами, ведь вам нужно сделать это вычисление 50 раз.
Следующий подход будет работать и для 3D, но, вероятно, не самый быстрый:
Минимальное расстояние до многоугольника в 2D-пространстве
Вопрос в том, готовы ли вы променять точность на скорость? Например. вы можете упаковать все полигоны в ограничивающие прямоугольники, где стороны прямоугольников параллельны осям системы координат. В 3D-играх этот подход используется довольно часто. Поэтому вам нужно найти максимальное и минимальное значения для каждой координаты (x, y, z), чтобы построить виртуальную ограничивающую рамку. В таком случае вычисление расстояний до этих ограничивающих рамок является довольно тривиальной задачей.
Вот пример изображения более продвинутых ограничивающих рамок, которые не параллельны осям системы координат:
Ориентированные ограничивающие рамки - OBB
Однако это делает расчет расстояния менее тривиальным. Он используется для обнаружения столкновений, поскольку вам не нужно знать расстояние для этого, вам нужно только знать, лежит ли один край одного ограничивающего прямоугольника внутри другого ограничивающего прямоугольника.
На следующем изображении показана ограничительная рамка, выровненная по осям:
Ограничивающая рамка с выравниванием осей - AABB
OOB более точны, AABB быстрее. Может быть, вы хотите прочитать эту статью:
Расширенные методы обнаружения столкновений
Это всегда предполагает, что вы готовы торговать точностью на скорость. Если точность важнее скорости, вам может понадобиться более продвинутая техника.
person
Mecki
schedule
17.09.2008