我一直试图解决这个问题,我发现了一个可以得出零分割误差的方程式。不是最好的事情:
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。
谢谢。
答案 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])