[nodejs] Collision entre deux SVG

a marqué ce sujet comme résolu.

Bonjour,

Je cherche à détecter la collision entre deux images au format SVG, sans rendu graphique, tout cela en javascript, à partir de ces informations:

  • La position (x et y)
  • La rotation (en radian)
  • La largeur
  • La hauteur
  • Le chemin d’accès de l’image svg

Voici des exemples de forme:

Image 1
Image 1
Image 2
Image 2

Il s’agit de formes vraiment complexe, il est donc difficile de faire la detection via des calculs.

Comment faire ? Toute aide est précieuse, que ce soit un début de solution ou un bout de code.

Merci

Bonjour Plantavisite,

Je te recommande l’excellent tuto sur Zeste de Savoir : https://zestedesavoir.com/tutoriels/2835/theorie-des-collisions/

En particulier la partie sur la Heightmap, ça pourrait t’aider à concevoir l’algorithme.

Yarflam

Merci, en effet ce tuto m’a l’air vraiment riche en informations, j’espère pouvoir y trouver des pistes. Cependant je n’arrive pas à voir comme le concept de Heightmap pourrait m’aider, est-ce que tu pourrais m’éclairer sur ce point s’il te plait ?

Un hack serait de dessiner tes svg dans deux canvas différents et de regarder si des pixels sont plein sur une position donnée.

A-312

Comme précisé dans le message, je ne veux pas avoir recours à un rendu graphique, et seulement passer par des opérations logiques.

Humm.

Définissons le problème.

  • As-tu besoin de performance ? Si oui, à quel point ? (Quantifie le nombre de vérification que tu pourrais avoir à faire au maximum par seconde)
  • As-tu besoin que le collision soit pixel-perfect ? Te contenterais tu d’une approximation ?
  • Es-tu sûr que les formes sont complexes ? Je veux dire d’ici, la sorte de girafe semble très simple (uniquement des segments). Alors que le gros machin semble au contraire un peu plus complexe (des courbes de béziers). Si unes seule des deux images est simple alors ça simplifie déjà le problème.

Avec ça tu sauras facilement ce dont tu as besoin et à quel point ça sera compliqué.

+1 -0

Humm.

Définissons le problème.

  • As-tu besoin de performance ? Si oui, à quel point ? (Quantifie le nombre de vérification que tu pourrais avoir à faire au maximum par seconde)
  • As-tu besoin que le collision soit pixel-perfect ? Te contenterais tu d’une approximation ?
  • Es-tu sûr que les formes sont complexes ? Je veux dire d’ici, la sorte de girafe semble très simple (uniquement des segments). Alors que le gros machin semble au contraire un peu plus complexe (des courbes de béziers). Si unes seule des deux images est simple alors ça simplifie déjà le problème.

Avec ça tu sauras facilement ce dont tu as besoin et à quel point ça sera compliqué.

ache

Déjà, il faut savoir qu’il y aura des dizaines, voir des centaines de couples à tester.

  • As-tu besoin de performance ? Si oui, à quel point ? (Quantifie le nombre de vérification que tu pourrais avoir à faire au maximum par seconde)

J’ai besoin de beaucoup de performance, je pense atteindre un maximum de 15.000 vérifications par seconde. Je sais, c’est énorme.

  • As-tu besoin que le collision soit pixel-perfect ? Te contenterais tu d’une approximation ?

Une approximation peut suffire, mais il ne faut pas qu’elle soit trop exagérée. Par exemple, pour la "girafe", il serait nécessaire que l’oreille soit prise en compte, alors que la petite bosse en bas sur le côté droit peut être ignorée.

  • Es-tu sûr que les formes sont complexes ? Je veux dire d’ici, la sorte de girafe semble très simple (uniquement des segments). Alors que le gros machin semble au contraire un peu plus complexe (des courbes de béziers). Si unes seule des deux images est simple alors ça simplifie déjà le problème.

Il est possible que les deux formes à tester soient simple, qu’elles soient complexes, ou un mélange des deux. Celles que j’ai fourni sont des exemples pour montrer la diversité des élements à tester.

Je pense déjà savoir que ce sera difficile à faire.

Comme dit Aabu, tu vas devoir approximer tes formes pas des polygones. À toi de voir comment, il y a plein de méthodes. T’as pas besoin vraiment que ça soit très rapide car ça ne sera fait qu’une fois par forme.

Ensuite tu dois implémenter un algorithme de collision sur ces polygones. Là, c’est de la géométrie algorithmique. Il existe plusieurs algorithmes pour ça. Vatti clipping, section « See also ».

Après, tu devras optimiser le truc derière en cas réel. C’est-à-dire que même un algorithme rapide comme ça, tu peux pas te permettre de faire ça pour la centaine de polygones. Du coup, tu vérifies d’abord que ça vaut le coup en faisant des tests AABB. Voir une autre méthode car AABB c’est pas forcément l’idéal pour tes formes si elles tournent.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte