Je suis un développeur de jeux flash actionscript qui est un peu en arrière avec les mathématiques, bien que je trouve la physique à la fois intéressante et cool.
Pour référence, c'est un jeu similaire à celui que je fais: jeu flash Untangled
J'ai fait de ce jeu démêlé presque complètement la logique. Mais, lorsque deux lignes se croisent, j'ai besoin de ces lignes croisées ou «emmêlées» pour montrer une couleur différente; rouge.
Ce serait vraiment gentil de votre part si vous pouviez suggérer un algorithme pour détecter les collisions de segments de ligne . Je suis fondamentalement une personne qui aime penser «visuellement» qu'arithmétiquement :)
Edit: je voudrais ajouter quelques diagrammes pour faire passer l'idée plus clairement
PS J'essaye de faire une fonction
private function isIntersecting(A:Point, B:Point, C:Point, D:Point):Boolean
Merci d'avance.
Réponses:
J'utilise la méthode suivante qui est à peu près juste une implémentation de cet algorithme . Il est en C # mais sa traduction en ActionScript devrait être triviale.
Il y a cependant un problème subtil avec l'algorithme, ce qui est le cas dans lequel deux lignes coïncident mais ne se chevauchent pas. L'algorithme renvoie toujours une intersectioin dans ce cas. Si vous vous souciez de ce cas, je crois que cette réponse sur stackoverflow a une version plus complexe qui y répond.
Éditer
C'est étrange, je l'ai testé et cela fonctionne pour moi, sauf pour le cas unique que j'ai décrit ci-dessus. En utilisant exactement la même version que j'ai publiée ci-dessus, j'ai obtenu ces résultats lorsque je l'ai pris pour un essai routier:
la source
Sans divisions! Donc pas de problème de précision ni de division par zéro.
Le segment de ligne 1 est de A à B Le segment de ligne 2 est de C à D
Une ligne est une ligne sans fin, le segment de ligne est une partie définie de cette ligne.
Vérifiez si les deux boîtes englobantes se croisent: si aucune intersection -> Pas de croix! (calcul effectué, retour faux)
Vérifiez si la ligne seg 1 chevauche la ligne seg 2 et si la ligne seg 2 chevauche la ligne seg 1 (c'est-à-dire que le segment de ligne 1 est des deux côtés de la ligne définie par la ligne segment 2).
Cela peut être fait en traduisant tous les points par -A (c'est-à-dire que vous déplacez les 2 lignes pour que A soit en origo (0,0))
Ensuite, vous vérifiez si les points C et D sont de différents côtés de la ligne définie par 0,0 à B
Si vous n'avez pas encore obtenu "Pas de croix", continuez à utiliser non pas A, B contre C, D mais C, D contre A, B (mêmes calculs, échangez simplement A et C, B et D), s'il n'y a pas "Pas de croix!" alors vous avez une intersection!
J'ai cherché les calculs exacts pour le produit croisé et j'ai trouvé cet article de blog qui explique également la méthode.
la source
Je veux juste dire que j'en avais besoin pour mon jeu Gamemaker Studio et cela fonctionne bien:
la source
La réponse acceptée a donné une mauvaise réponse dans ce cas:
Ces lignes ne se coupent évidemment pas, mais selon la fonction de la "bonne réponse", les lignes se croisent.
Voici ce que j'utilise:
renvoie 0 = les lignes ne se coupent pas
renvoie> 0 = les lignes se croisent
Mettre à jour pour répondre à la question:
Je n'ai pas créé ce code moi-même. Il a plus de 5 ans et je ne connais pas la source d'origine. Mais..
Je pense que la valeur de retour est la position relative de la première ligne où ils se croisent (pour l'expliquer mal). Pour calculer le point d'intersection, vous pourriez probablement utiliser lerp comme ceci:
(JE N'AI PAS TESTÉ CELA)
la source