Как обнаружить коллизии между спрайтом и какой-либо формой, созданной пользователем?


9

Как обнаружить столкновение между спрайтом и какой-то сгенерированной пользователем формой.

Например. На экране есть несколько объектов. Пользователь берет палец и рисует круговую форму вокруг объекта (правило выбора - рисовать круг вокруг спрайта, но формы рисования могут быть различными). Мне нужно определить, какой объект выбран, который так же, как:

(демонстрационные изображения): Первоначально опубликовано как http://i52.tinypic.com/28h0t1g.png


Можете ли вы объяснить, почему синий выбран, а не красный в вашем последнем примере? Можете ли вы также уточнить, должна ли линия касаться спрайта? Третий пример не касается красного поля, но оно указано как выбранное. Пятый пример очень похож, но не выбран. Какую разницу вы ищете между № 3 и № 5?
Ромен

Ответы:


2

Если форма нарисована в основном из отрезков линии от пользователя (или кривых Безье с контрольными точками), вы можете реализовать довольно широко используемый алгоритм, известный как Теорема о разделяющей оси . Проще говоря: если есть ось (единичный вектор, представляющий направление), на которой фигуры не перекрываются (их проецируемые значения не приводят к положительной разнице), объекты не перекрываются. Я использовал это в прошлом, и это сработало как шарм.



0
  • Создайте буфер того же размера, что и экран (или поверхность, где находятся ваши фигуры). В каждой позиции он содержит логическое значение, есть ли спрайт; затем проверьте все «пиксели» пользовательской формы, находится ли на их месте спрайт (путем проверки значения этого логического значения). В качестве альтернативы, вы можете создать больше спрайтов, сохранив их идентификатор вместо логического; но это был случай 1 спрайта.
  • Если созданная пользователем форма может быть представлена ​​последовательностью линий, тогда Вы можете проверить, пересекает ли каждая такая линия спрайт. Поскольку спрайт имеет прямоугольную форму, а пользовательская форма - это линия, просто ищите «пересечение прямоугольника линии» ... (алгоритм разделения осей и один способ сделать это)

Подходы зависят от того, какие структуры данных вы выбираете, будь то растровые изображения или векторы.

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

Второй подход не так прост в реализации, но использует больше вычислительной мощности.

В каждом случае мера, если это имеет значение. Я бы попробовал сделать первый, потому что его проще реализовать. Удачи. :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.