Como detectar colisões entre sprite e uma forma gerada pelo usuário de algum tipo?

9

Como detectar uma colisão entre um sprite e uma forma gerada pelo usuário de algum tipo.

Por exemplo. Existem alguns objetos na tela. O usuário pega o dedo e desenha uma forma de círculo em torno de um objeto (a regra de seleção é pintar um círculo em torno do sprite, mas as formas de pintura podem ser diversas). Preciso detectar qual objeto selecionado, como:

(imagens de demonstração): publicado originalmente como http://i52.tinypic.com/28h0t1g.png

Huwell
fonte
Você pode explicar por que o azul é selecionado e não o vermelho no seu exemplo final? Você também pode esclarecer se a linha precisa tocar o sprite? O terceiro exemplo não toca na caixa vermelha, mas é indicado como selecionado. O quinto exemplo é muito semelhante, mas não selecionado. Qual é a diferença que você está procurando entre os nºs 3 e 5?
Romen

Respostas:

2

Se a forma for desenhada principalmente com segmentos de linha do usuário (ou curvas de Bezier com pontos de controle), você poderá implementar um algoritmo amplamente utilizado, conhecido como Teorema do Eixo Separador . Simplificando: se houver um eixo (vetor unitário representando uma direção) no qual as formas não se sobrepõem (seus valores projetados não resultam em uma diferença positiva), os objetos não se sobrepõem. Eu usei isso no passado e funcionou como um encanto.

Grimless
fonte
1

Se a forma for desenhada à mão, como na Crayon Physics , você poderá segurar uma série de linhas retas e verificar colisões com cada uma delas. Apesar das linhas retas, você pode usar curvas de Bezier ou algo parecido.

canto superior direito
fonte
0
  • Crie um buffer do mesmo tamanho que a tela (ou a superfície onde estão suas formas). Em cada posição, contém booleano se existe sprite; depois, verifique todos os "pixels" da forma do usuário se na posição deles é o sprite (verificando o valor desse booleano). Como alternativa, você pode criar mais sprites lá, armazenando seu ID em vez de booleano; mas este foi o caso de 1 sprite.
  • Se a forma gerada pelo usuário puder ser representada pela sequência de linhas, você poderá verificar se cada uma dessas linhas cruza o sprite. Como o sprite tem forma retangular e a forma do usuário é uma linha, basta procurar por "interseção de retângulo de linha" ... (algoritmo de eixos de separação e uma maneira de fazê-lo)

As abordagens dependem de quais estruturas de dados você escolhe, sejam elas bitmaps ou vetores.

A primeira abordagem pode lidar com formas complexas arbitrárias, é simples de implementar, mas usa mais memória. Na verdade, você pode reduzir a sobrecarga da memória usando a compactação e acelerá-la usando estruturas hierárquicas de dados (octrees) ...

Segunda abordagem, não é tão simples de implementar, mas usa mais poder de processamento.

Em cada caso, meça se isso for importante. Eu tentaria fazer o primeiro porque é mais simples de implementar. Boa sorte. :)

user712092
fonte