Comment détecter les collisions entre l'image-objet et une forme quelconque générée par l'utilisateur?

9

Comment détecter une collision entre un sprite et une forme générée par l'utilisateur.

Par exemple. Il y a des objets sur l'écran. L'utilisateur prend son doigt et dessine une forme de cercle autour d'un objet (la règle de sélection consiste à peindre un cercle autour du sprite, mais les formes de peinture peuvent être diverses). J'ai besoin de détecter quel objet sélectionné, tout comme:

(images de démonstration): initialement publié en tant que http://i52.tinypic.com/28h0t1g.png

Huwell
la source
Pouvez-vous expliquer pourquoi le bleu est sélectionné et non le rouge dans votre dernier exemple? Pouvez-vous également préciser si la ligne doit réellement toucher le sprite? Le troisième exemple ne touche pas la case rouge mais il est indiqué comme sélectionné. Le 5ème exemple est très similaire mais non sélectionné. Quelle est la différence que vous recherchez entre le n ° 3 et le n ° 5?
Romen

Réponses:

2

Si la forme est dessinée principalement avec des segments de ligne de l'utilisateur (ou des courbes de Bézier avec des points de contrôle), vous pouvez implémenter un algorithme assez largement utilisé connu sous le nom de Théorie de l'axe de séparation . En termes simples: s'il existe un axe (unité-vecteur représentant une direction) sur lequel les formes ne se chevauchent pas (leurs valeurs projetées n'entraînent pas de différence positive), les objets ne se chevauchent pas. Je l'ai utilisé dans le passé et cela a fonctionné comme un charme.

Grimless
la source
1

Si la forme est dessinée à la main comme dans Crayon Physics , vous pouvez tenir un tableau de lignes droites et vérifier les collisions avec chacune d'elles. Malgré les lignes droites, vous pouvez utiliser des courbes de Bézier ou quelque chose comme ça.

en haut à droite
la source
0
  • Créez un tampon de même taille que l'écran (ou la surface où sont vos formes). À chaque position, il contient booléen s'il y a un sprite; puis, vérifiez tous les "pixels" de la forme de l'utilisateur, que ce soit à leur position le sprite (en vérifiant la valeur de ce booléen). Alternativement, vous pouvez y créer plus de sprites en stockant leur ID au lieu de booléen; mais c'était le cas d'un sprite.
  • Si la forme générée par l'utilisateur peut être représentée par une séquence de lignes, vous pouvez vérifier si chacune de ces lignes croise l'image-objet. Étant donné que le sprite a une forme rectangulaire et que la forme de l'utilisateur est une ligne, recherchez simplement "intersection rectangle de ligne" ... (algorithme de séparation des axes si une façon de le faire)

Les approches dépendent des structures de données que vous choisissez, qu'il s'agisse de bitmaps ou de vecteurs.

La première approche peut gérer des formes complexes arbitraires, est simple à implémenter mais utilise plus de mémoire. En fait, vous pouvez réduire la surcharge de la mémoire en utilisant la compression et l'accélérer en utilisant des structures de données hiérarchiques (octrees) ...

La seconde approche n'est pas si simple à mettre en œuvre mais utilise plus de puissance de traitement.

Dans chaque cas, mesurez si cela est important. J'essaierais de faire le premier car il est plus simple à mettre en œuvre. Bonne chance. :)

user712092
la source