Numpy et lignes intersections
Comment puis-je utiliser numpy pour calculer l'intersection entre deux segments de ligne?
Dans le code j'ai segment1 = ((x1,y1),(x2,y2)) et segment2 = ((x1,y1),(x2,y2)). Note segment 1 n'est pas égal à segment2. Donc, dans mon code j'ai aussi été le calcul de la pente et de l'ordonnée à l'origine, ce serait bien si ça pouvait être évitée, mais je ne sais pas de manière à faire.
J'ai été en utilisant la règle de Cramer avec une fonction que j'ai écrit en Python, mais j'aimerais trouver un moyen plus rapide de faire cela.
source d'informationauteur Xavier | 2010-07-15
Vous devez vous connecter pour publier un commentaire.
De vol directement à partir de http://www.cs.mun.ca/~rod/2500/notes/numpy-arrays/numpy-arrays.html
C'est une réponse tardive, peut-être, mais il a été le premier a frappé quand j'ai Googlé 'numpy intersections des lignes'. Dans mon cas, j'ai deux lignes dans un avion, et je voulais obtenir rapidement toutes les intersections entre eux, et Hamish solution serait lente-exigeant un imbriqués pour boucler sur tous les segments de ligne.
Voici comment le faire sans une boucle (c'est assez rapide):
Puis de l'utiliser, fournir deux lignes, comme arguments, où est-arg est un 2 matrice colonne, chaque ligne correspondant à un (x, y) le point:
avoir du plaisir
Explication
Remarque que l'équation d'une ligne est
ax+by+c=0
. Donc, si un point est sur cette ligne, alors que c'est une solution à(a,b,c).(x,y,1)=0
(.
est le produit scalaire)laisser
l1=(a1,b1,c1)
l2=(a2,b2,c2)
deux lignes etp1=(x1,y1,1)
p2=(x2,y2,1)
deux points.Trouver la ligne passant par les deux points:
laisser
t=p1xp2
(le produit vectoriel de deux points) soit un vecteur représentant une ligne.Nous savons que
p1
est sur la lignet
parce quet.p1 = (p1xp2).p1=0
.Nous savons aussi que
p2
est surt
parce quet.p2 = (p1xp2).p2=0
. Donct
doit être la ligne passant parp1
etp2
.Cela signifie que nous pouvons obtenir le vecteur de la représentation d'une ligne en prenant le produit vectoriel de deux points sur cette ligne.
Trouver le point d'intersection:
Maintenant, laissez -
r=l1xl2
(le produit vectoriel de deux lignes) être un vecteur représentant un pointNous savons
r
se trouve surl1
parce quer.l1=(l1xl2).l1=0
. Nous savons aussir
se trouve surl2
parce quer.l2=(l1xl2).l2=0
. Doncr
doit être le point d'intersection des lignesl1
etl2
.Il est intéressant de noter, l'on peut trouver le point d'intersection en prenant le produit vectoriel de deux lignes.
Ceci est une version de @Hamish Grubijan réponse qui fonctionne également pour plusieurs points dans chacun des arguments d'entrée, c'est à dire,
a1
a2
b1
b2
peut être Nx2 ligne des tableaux de points 2D. Leperp
fonction est remplacé par un produit scalaire.Voici un (peu forcée) one-liner:
Interpoler la différence (la valeur par défaut est linéaire), et de trouver un 0 de l'inverse.
Cheers!
C'est ce que j'utilise pour trouver l'intersection, il fonctionne soit 2 points de chaque ligne, ou tout simplement un point et de son inclinaison. J'ai fondamentalement résoudre le système d'équations linéaires.