如何在每条线上给出一个点和一个平行向量的两条线的交点

时间:2017-01-23 01:13:36

标签: python algorithm math graphics intersection

我需要一种可以找到两条2D线交点的算法。每行将以线上的点和平行向量的dx / dy 的形式出现。我已经尝试参数化每一行并求解方程组来求解参数化变量,我可以将其插回到线的参数方程并得到我的x / y,但我的尝试失败了。有任何想法吗?我用Python编程,但语言并不重要。

1 个答案:

答案 0 :(得分:2)

你基本上必须解决以下等式:

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

或者:

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

现在,如果你进行一些代数操作,你会发现:

T = DY <子> B'/子>×(X <子> 0,B -x <子> 0,一个) - DX <子> B'/子> ×(Y <子> 0,b -y <子> 0,一个)/ d
U = DY <子>一×(X <子> 0,B -x <子> 0,一个) - DX <子>一×(Y <子> 0,b -y <子> 0,一个)/ d;其中
d = DX <子>一×DY <子> B'/子> -dx <子> B'/子>×DY <子>一

现在只需确定tu(您不必同时计算两者),然后插入上面的公式。所以

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)

如果等式中的d(分母)等于零,则表示没有交点(两条线是平行的)。您可以决定更改函数,例如返回None或在这种情况下引发异常。

如果你测试它,例如用向量(1,0)偏移和方向(0,1);和偏移量(0,2)和方向(1,1)的向量;你得到了不太令人惊讶的结果:

$ 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)