Як виявити зіткнення між спрайтом та певною формою, створеною користувачем?


9

Як виявити зіткнення між спрайтом та певною створеною користувачем формою.

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

(демонстраційні зображення): спочатку розміщено як http://i52.tinypic.com/28h0t1g.png


Чи можете ви пояснити, чому у вашому останньому прикладі вибрано синій, а не червоний? Чи можете ви також уточнити, чи має ця лінія насправді торкатися спрайту? Третій приклад не стосується червоного поля, але він вказаний як обраний. 5-й приклад дуже схожий, але не вибраний. Яку різницю ви шукаєте між №3 та №5?
Ромен

Відповіді:


2

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


1

Якщо форма намальована вручну, як у Crayon Physics , ви можете провести масив прямих і перевірити зіткнення з кожною з них. Незважаючи на прямі лінії, ви можете використовувати криві Безьє чи щось подібне.


0
  • Створіть буфер такого ж розміру, як екран (або поверхня, де є Ваші форми). У кожному положенні він містить булевий, чи є спрайт; потім перевірте всі "пікселі" форми користувача, чи знаходиться у їхньому положенні спрайт (перевіряючи значення цього булевого значення). Крім того, ви можете створити там більше спрайтів, зберігаючи їх ідентифікатор замість булевого; але це був випадок 1 спрайта.
  • Якщо створена користувачем форма може бути представлена ​​послідовністю рядків, то Ви можете перевірити, чи перетинає кожен спрайт спрайт. Оскільки спрайт має прямокутну форму, а форма користувача - це лінія, просто шукайте "перетин прямокутника лінії" ... (алгоритм розділення осей si один із способів зробити це)

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

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

Другий підхід, не такий простий у здійсненні, але використовує більше процесорної потужності.

У кожному випадку міра, якщо це має значення. Я спробував би зробити перший, тому що це простіше втілити. Удачі. :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.