找到两个矢量方程的交集

时间:2010-06-18 01:09:35

标签: c++ python math graphics

我一直试图解决这个问题,我发现了一个可以得出零分割误差的方程式。不是最好的事情:

v1 = (a,b)
v2 = (c,d)
d1 = (e,f)
d2 = (h,i)

l1: v1 + λd1
l2: v2 + µd2

Equation to find vector intersection of l1 and l2 programatically by re-arranging for lambda.

(a,b) + λ(e,f) = (c,d) + µ(h,i)
a + λe = c + µh
b +λf = d + µi
µh = a + λe - c
µi = b +λf - d
µ = (a + λe - c)/h
µ = (b +λf - d)/i
(a + λe - c)/h = (b +λf - d)/i
a/h + λe/h - c/h = b/i +λf/i - d/i
λe/h - λf/i =  (b/i - d/i) - (a/h - c/h)
λ(e/h - f/i) = (b - d)/i - (a - c)/h
λ = ((b - d)/i - (a - c)/h)/(e/h - f/i)

Intersection vector = (a + λe,b + λf)

不确定在某些情况下是否会起作用。我还没有测试过。

我需要知道如何为值执行此操作,例如a-i。

谢谢。

3 个答案:

答案 0 :(得分:1)

如果你在谷歌搜索intersection of lines,你会发现许多不涉及其中一个坐标的公式。从维基百科引用的sputsoft对该算法有一个很好的解释。

关于你的数学,你太快速除以 h i 。可以通过推迟部门来解决问题。例如,将μh的等式乘以 i ,将μi的等式乘以 h 得到两个等式μhi。然后,这给出了λ的最终等式,它等同于你的,但没有潜在的非法划分:

  

λ=((b - d)h - (a - c)i)/(ei - fh)

只需将λ的顶部和底部乘以 hi

答案 1 :(得分:0)

在计算之前,确保d1向量与d2向量不平行(或接近平行)。如果它们是平行的,那么你的线不会相交,你会得到零分误差。

使用你的变量,如果(e i - f h)等于或接近0,你的线是平行的。

答案 2 :(得分:0)

这是具有python功能的解决方案。 v1和v2是位置向量。 d1和d2是方向向量。

def vector_intersection(v1,v2,d1,d2):
    '''
    v1 and v2 - Vector points
    d1 and d2 - Direction vectors
    returns the intersection point for the two vector line equations.
    '''
    if d1[0] == 0 and d2[0] != 0 or d1[1] == 0 and d2[1] != 0:
        if d1[0] == 0 and d2[0] != 0:
            mu = float(v1[0] - v2[0])/d2[0]
        elif d1[1] == 0 and d2[1] != 0:
            mu = float(v1[1] - v2[1])/d2[1]
        return (v2[0] + mu* d2[0],v2[1] + mu * d2[1])
    else:
        if d1[0] != 0 and d1[1] != 0 and d2[0] != 0 and d2[1] != 0:
            if d1[1]*d2[0] - d1[0]*d2[1] == 0:
                raise ValueError('Direction vectors are invalid. (Parallel)')
            lmbda = float(v1[0]*d2[1] - v1[1]*d2[0] - v2[0]*d2[1] + v2[1]*d2[0])/(d1[1]*d2[0] - d1[0]*d2[1])
        elif d2[0] == 0 and d1[0] != 0:
            lmbda = float(v2[0] - v1[0])/d1[0]
        elif d2[1] == 0 and d1[1] != 0:
            lmbda = float(v2[1] - v1[1])/d1[1]
        else:
            raise ValueError('Direction vectors are invalid.')
        return (v1[0] + lmbda* d1[0],v1[1] + lmbda * d1[1])