2017-01-23 1 views
0

J'ai besoin d'un algorithme capable de trouver l'intersection de deux lignes 2D. Chaque ligne viendra sous la forme un point sur la ligne et le dx/dy d'un vecteur parallèle. J'ai essayé de paramétrer chaque ligne et de résoudre le système d'équations à résoudre pour la variable paramétrée que je pourrais replacer dans l'équation paramétrique des lignes et obtenir mon x/y, mais ma tentative a échoué. Des idées? Je suis en programmation en Python mais le langage n'a pas beaucoup d'importance.Comment trouver l'intersection de deux lignes avec un point sur chaque ligne et un vecteur parallèle

+1

"mais ma tentative a échoué" - si seulement il y avait * un * moyen que nous pourrions voir votre tentative? Ce serait une information utile pour nous, oui? :-) – paxdiablo

+0

Que voulez-vous dire par "dx/dy d'un vecteur parallèle"? Voulez-vous dire qu'on vous donne la pente de la ligne (puisque les lignes parallèles ont la même pente), ou un vecteur directionnel de la ligne, ou autre chose? Et nous avons besoin de voir des preuves de votre travail sur le problème, si rien d'autre afin que nous puissions voir ce qui a échoué. –

+0

@paxdiablo - wow si salé. Mais bien sûr. Je ne l'ai pas inclus parce que c'était long et mauvais. J'ai commencé par 'x = x1 + t1 * dx1, y = y1 + t1 * dy1, x = x2 + t2 * dx2, y = y2 + t2 * dy2. après avoir résolu le système d'équations, j'ai fini par t2 = (x2dy1-x1dy1-y1y2dx1)/(dy2dy1-dx1dy2). 'Quand j'ai essayé d'utiliser les valeurs:' (x1, y1) = (0,0), (x2, y2) = (1,1), (dx1, dy1) = (1,0), (dx2, dy2) = (0, -1) 'J'ai un 0 en bas de l'équation t2. –

Répondre

2

Vous avez essentiellement pour résoudre l'équation suivante:

x = x 0, un + dx un × t
y = y 0, un + dy un × t
x = x 0, b + dx b × u
y = y 0, b + dy b × u

Or:

x 0, a + dx un × t = x 0, b + dx b × u
x 0, un + dx un × t = x 0, b + dx b × u

Maintenant, si vous faites une manipulation algébrique, vous constaterez que:

t = dy b × (x 0, b -x 0, un) -DX b × (y 0, b -y 0, un)/d
u = dy un × (x 0, b -x 0, un) -DX un × (y 0, b -y 0, un)/d; où
d = dx un × dy b -dx b × dy un

Maintenant, il est donc seulement une question de déterminer soit t ou u (vous n'avez pas à calculer à la fois) , et branchez ensuite dans la formule ci-dessus.Alors

def intersect(x0a,y0a,dxa,dya,x0b,y0b,dxb,dyb): 
    t = (dyb*(x0b-x0a)-dxb*(y0b-y0a))/(dxa*dyb-dxb*dya) 
    return (x0a+dxa*t,y0a+dya*t) 

Si l'd dans l'équation (le dénominateur) est égal à zéro, cela signifie qu'il n'y a pas d'intersection (les deux lignes sont parallèles). Vous pouvez décider de modifier la fonction et par exemple retourner None ou déclencher une exception dans un tel cas.

Si vous le testez, par exemple avec un vecteur (1,0) décalage et direction (0,1); et un vecteur avec décalage (0,2) et direction (1,1); vous obtenez le résultat pas très surprenant de:

$ python3 
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> def intersect(x0a,y0a,dxa,dya,x0b,y0b,dxb,dyb): 
...  t = (dyb*(x0b-x0a)-dxb*(y0b-y0a))/(dxa*dyb-dxb*dya) 
...  return (x0a+dxa*t,y0a+dya*t) 
... 
>>> intersect(1,0,0,1,0,2,1,1) 
(1.0, 3.0) 
+1

Si je pouvais upvote votre réponse 10 fois je le ferais. Merci beaucoup. –