Время выполнения алгоритма обнаружения столкновений

Я придумал алгоритм для предсказания столкновения двух частиц. Учитывая прямоугольную среду (ширина w, высота h) и две частицы с известными начальными положениями и скоростями, он может определить

  • Будут ли эти две частицы когда-либо сталкиваться
  • Если да, то время следующего столкновения двух частиц.

за конечное число шагов, так сказать O(1). Более того, это можно сделать для n частиц в O(n^2). Есть ли что-то новое в этом подходе?

Я предполагаю, что частицы движутся линейно и с постоянной скоростью и занимают точки (так что столкновение будет, когда две частицы занимают одну и ту же точку).

Спасибо за помощь.


person vincemathic    schedule 21.02.2016    source источник
comment
Я думаю, что для проверки всех пар частиц требуется O (n (n + 1)), что равно O (n ^ 2). Я не думаю, что есть более быстрый алгоритм.   -  person    schedule 21.02.2016
comment
Это зависит от того, что вы подразумеваете под романом. Это кажется достаточно простой проблемой, и вы вряд ли станете богатым и знаменитым от нее. Но это также не проблема, которую я видел в прошлом.   -  person Sneftel    schedule 21.02.2016
comment
(Это при условии, что частицы отскакивают от краев окружающей среды. Если этого не происходит, то, конечно, это тривиальная проблема.)   -  person Sneftel    schedule 21.02.2016


Ответы (2)


Это очень легко сделать за время O(n^2) для n частиц, просто сравнив все пары частиц и экстраполировав отрезок прямой для каждой, чтобы увидеть, где они сталкиваются.

Существуют более эффективные алгоритмы, часто основанные на идее индексации ваших объектов в памяти с помощью чего-то вроде quadtree; статья Википедии об обнаружении столкновений содержит хороший обзор другого возможного подхода.

person Nick Johnson    schedule 21.02.2016
comment
Спасибо за ответ. Разработанный мной алгоритм также может работать в измерениях n (предсказывая столкновение между двумя частицами) за O(n) (точное количество проверяемых случаев равно 4(n-1) ). Он может доказать, что две частицы либо столкнутся в некоторый момент времени t, либо вообще никогда не столкнутся. Отличается ли это от существующих подходов? - person vincemathic; 21.02.2016
comment
@vincematic Вы все еще можете сделать это, просто взяв каждую пару частиц и проецируя их пути, чтобы найти, где пересекаются их векторы, что является операцией O (1). Я не знаю, можно ли это сделать менее чем за O(n^2) времени, но неудивительно, что вы можете выполнять n^2 O(1) операций за O(n^2) время! - person Nick Johnson; 22.02.2016

Вот простое решение, предполагающее растеризованную настройку и то, что столкновения (между частицами или частицами со стенками) не изменяют направление и скорость частиц. Основная идея состоит в том, чтобы «раскрасить» траектории частиц в растр размером w x h.

allocate a raster of size w*h, each pixel being able to keep a list of (time,particle_id) tuples
for each particle pa
    for each pixel pi on the direction of pa
        store the tuple (time_of_pa_at_pi, pa_id) in the list of pi
for each pixel pi in the raster
    check for collisions inside the list of pi by ordering the tuples by time

Наихудший сценарий довольно сложно описать, но верхняя граница производительности — O(n*max(w,h)) + O(wh) + max(w,h)*O(n*logn). Наихудший сценарий (сценарии), вероятно, имеет место, когда все частицы (или большая их часть) движутся в одном направлении. Это крайне маловероятно, если предположить равномерное случайное распределение всех входных параметров. Предполагая, что в среднем сценарии производительность должна быть намного лучше.

Кроме того (но это, вероятно, важная часть этого ответа), вы можете получить ускорение, если сначала выделите меньший растр (например, размером w/c x h/c) и запустите проверку вероятного столкновения таким же образом, как указано выше. Пиксели в этом растре больше, поэтому шаг вероятного столкновения занимает меньше времени. В конце этого шага вы получаете представление о том, что может произойти в каждом макроскопическом пикселе, а затем продолжаете свое исследование локально (рекурсивным способом или с использованием какой-либо другой техники). c выше может быть константой или некоторой функцией w, h и n (например, c=sqrt(max(w,h))).

Конечно, все вышеперечисленное бесполезно, если w и/или h неудобно велики.

person cobarzan    schedule 21.02.2016
comment
голосующему против, какая часть моего ответа вам не понравилась/посчитала необоснованной? - person cobarzan; 21.02.2016