Tester si deux droites se coupent - fonction JavaScript
J'ai essayé de chercher une fonction javascript qui permet de détecter si deux droites se coupent les uns des autres.
La fonction va prendre les valeurs x,y de la fois le début de la fin des points pour chaque ligne (qu'on appellera la ligne A et la ligne B).
Est de retourner vrai si elles se croisent, sinon faux.
Exemple de la fonction. Je suis heureux si la réponse utilise un objet vector à la place.
Function isIntersect (lineAp1x, lineAp1y, lineAp2x, lineAp2y, lineBp1x, lineBp1y, lineBp2x, lineBp2y)
{
//JavaScript line intersecting test here.
}
Quelques informations de base: ce code est un jeu que je suis en train de faire en html5 canvas, et est une partie de mon détection de collision.
- double possible de stackoverflow.com/questions/563198/...
- Cette question semble être hors-sujet, car il est à propos de l'école de mathématiques
- Oui... ou algorithme de détection de collision pour le développement d'un jeu.
- depuis quand en mathématiques du secondaire, la couverture de la normalisation des équations de réduire de calcul de frais généraux? Jarrod peut ne pas avoir explicitement demandé, mais il est implicite dans le cas d'utilisation il présente. (Ma réponse est directement équivalent à la reconnus, c'est tout simplement mieux optimisé.)
- Il y a une nouvelle meilleure réponse, mais les résultats ne sont pas encore compte que. Faites défiler vers le bas pour Dan Fox code, qui est élégant, concis et risque d'être encore plus rapide que la mienne. Il n'a besoin de peaufinage à l'humidité, à virgule flottante erreurs. Si vous avez besoin d'un échantillon pour que, aussi regarder ma réponse.
Vous devez vous connecter pour publier un commentaire.
Explication: (vecteurs, matrices et un coup de déterminant)
Lignes peut être décrit par certains initial vecteur v, et un vecteur de direction, d:
Nous utilisons un point
(a,b)
comme le premier vecteur et la différence entre eux(c-a,d-b)
comme le vecteur de direction. De même pour notre deuxième ligne.Si nos deux lignes se croisent, alors il doit y avoir un point de X, qui est accessible en voyageant à une certaine distance, lambda, le long de notre première ligne et également accessible par le voyage gamma unités le long de notre deuxième ligne. Cela nous donne deux équations simultanées pour les coordonnées de X:
Ces équations peuvent être représentés sous forme de matrice. Nous vérifions que le déterminant est non nul pour voir si l'intersection de X existe même.
Si il y a une intersection, il faut vérifier que l'intersection réalité se situe entre les deux ensembles de points. Si lambda est supérieur à 1, l'intersection est au-delà du deuxième point. Si lambda est inférieure à 0, l'intersection est avant le premier point.
Donc,
0<lambda<1 && 0<gamma<1
indique que les deux lignes se croisent!if
contrôle de((-0.01 < lambda && lambda < 1.01) && (-0.01 < gamma && gamma < 1.01))
détecte également les lignes qui "apparaissent" à se croisent lors du rendu HTML de la toile (assez proche de compter dans mon cas d'utilisation particulier)a,b,c,d,p,q,r,s
de-10347270, 5119881, -10347300, 5119880, -10347268, 5119874, -10347277, 5119906
, lambda serait-0.0010319917440660474
mais les lignes apparaissent à peine toucherLa wiki page, j'ai trouvé la réponse à partir d'.
x1===x2
. (J'avais besoin de coordonnées donc je ne pouvais pas utiliser le @Joncom version.) gist.github.com/gordonwoodhull/50eb65d2f048789f9558Peter Wone réponse est une excellente solution, mais il manque une explication. J'ai passé la dernière heure à comprendre comment il fonctionne et pense que je comprends assez pour l'expliquer ainsi. Voir sa réponse pour plus de détails: https://stackoverflow.com/a/16725715/697477
J'ai également inclus une solution pour le co-linéaire des lignes dans le code ci-dessous.
À l'aide de Rotation des Directions de vérifier pour l'intersection
Pour expliquer la réponse, regardez quelque chose de commun à propos de chaque point d'intersection de deux lignes. Compte tenu de l'image ci-dessous, nous pouvons voir que P1 à IP à P4 tourne dans le sens antihoraire. Nous pouvons voir que c'est gratuit côtés tourner dans le sens horaire. Maintenant, nous ne savons pas si elle croise, de sorte que nous ne savons pas le point d'intersection. Mais nous pouvons aussi voir que P1 à P2 à P4 aussi tourne dans le sens antihoraire. En outre, P1 à P2 à P3 tourne dans le sens horaire. Nous pouvons utiliser ces informations pour déterminer si deux droites se coupent ou pas.
Exemple D'Intersection De
Vous remarquerez que l'intersection des lignes de créer quatre faces point des directions opposées. Depuis ils font face à des directions opposées, nous savons que la direction de P1 à P2 à P3 tourne un sens différent de celui P1 à P2 à P4. Nous savons aussi que P1 à P3 à P4 tourne une direction différente de celle P2 à P3 à P4.
Non-Intersection Exemple
Dans cet exemple, vous devriez remarquer que, suivant le même schéma pour l'intersection de test, les deux faces de tourner dans la même direction. Depuis ils font face à la même direction, nous savons qu'ils ne se croisent pas.
Exemple De Code
Donc, nous pouvons mettre en œuvre dans le code d'origine fourni par Peter Wone.
JS:
HTML:
Bien qu'il est utile d'être en mesure de trouver le point d'intersection, le test de si ligne de segments se coupent est le plus souvent utilisé pour les polygones hit-test, et étant donné les applications usuelles de cela, vous avez besoin de le faire rapide. Par conséquent, je vous suggère de faire comme cela, à l'aide seulement de soustraction, de multiplication, de comparaison et de ET de.
Turn
calcule la direction du changement de pente entre les deux bords décrit par les trois points: 1 signifie dans le sens antihoraire, 0 signifie pas de tourner et de -1 signifie dans le sens horaire.Ce code prévoit points exprimés comme GLatLng objets, mais peut être trivialement réécrit à d'autres systèmes de représentation. La pente de comparaison a été normalisée à epsilon tolérance à l'humidité, à virgule flottante erreurs.
GLatLng
au lieu d'une simplex,y
coordonnées?J'ai réécrit Peter Wone, la réponse à une seule fonction à l'aide de x/y, au lieu de la lat()/long()
Voici une version basée sur ce gist avec un peu plus concis, les noms de variables, et un peu de Café.
Version JavaScript
CoffeeScript version
Tout d'abord, trouver l'intersection des coordonnées - là, il est décrit en détail:
http://www.mathopenref.com/coordintersection.html
De vérifier ensuite si la coordonnée x de l'intersection entre dans le x varie de l'une des lignes (ou de faire de même avec la coordonnée y, si vous préférez),
c'est à dire si xIntersection est entre lineAp1x et lineAp2x, alors qu'ils se croisent.
Pour tous les gens qui aimeraient avoir une des solutions toutes prêtes pour coldfusion, voici ce que j'ai adapté de http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/awt/geom/Line2D.java#Line2D.linesIntersect%28double%2Cdouble%2Cdouble%2Cdouble%2Cdouble%2Cdouble%2Cdouble%2Cdouble%29
la imporants fonctions sont ccw et linesIntersect à partir de java.awt.geom.Line2D et je leur ai écrit en coldfusion, alors nous y voici:
J'espère que cela peut aider pour s'adapter à d'autres langues?
Utiliser le pythageorum theorum pour trouver la distance entre les 2 objets et ajouter le rayon Pythageorum Theorum Formule De La Distance De