2010-06-18 5 views
1

저는 이것을 풀려고 노력했지만 제로 분할 오류가 발생할 수있는 방정식을 발견했습니다. 가장 좋은 것은 아닙니다 :두 벡터 방정식의 교차점 찾기

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

다음은 파이썬 기능을 갖춘 솔루션입니다. 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]) 
0

계산 전에 d1 벡터가 d2 벡터와 평행하지 않거나 거의 평행하지 않은지 확인하십시오. 병렬 인 경우 선이 교차하지 않아서 제로 분할 오류가 발생합니다.

vars를 사용하여 (0 i - f h)가 0이거나 거의 같으면 선이 평행합니다.

+0

@aeflash d1과 d2가 "거의"평행하지만 v1과 v2가 "거의"평행하면 교차가 발견 될 수 있습니다. 매우 평평한 롬 보드의 경우입니다. –

+0

답변 해 주셔서 감사합니다. 선은 항상 수직이지만 방향 벡터는 여전히 0을 가질 수 있습니다. 그들이 0 인 경우에 대해 다른 방정식을 계산할 수는 있지만 사람들이 프로그래밍 방식으로 사용하는 간단한 방법이 있는지 알고 있으면 좋을 것입니다. –

+0

아마도 그들이 수직이라는 사실은 사물을 단순화 할 수 있습니까? –

1

intersection of lines에 대한 Google 검색을 수행하면 좌표 중 하나에 의한 나누기가 포함되지 않은 많은 수식이 있습니다. 위키피디아에서 언급 한 sputsoft는 알고리즘에 대한 좋은 설명을 가지고 있습니다.

수학에 관해서는 hi으로 나눌 수 없습니다. 연기 방안을 통해 해결책을 얻을 수 있습니다. 예를 들어, I 의해 μH 대한 방정식을 곱하고 μhi 두 개의 방정식을 얻을 수 H 의해 μi위한 하나. 이는 다음 네 동등 λ 대한 최종 식을 제공하지만, 잠재적으로 잘못된 구분없이 :

λ = ((B - D) (H) - (a - c) ⅰ)/(EI - FH)

그냥 상단 증식하고 λ하이에 의해 바닥.

+0

그냥 돌아 왔습니다. ei == fh라면? –

+0

좋은 지적. 이것은 두 벡터가 평행 할 때 발생합니다. 즉, 두 벡터가 교차하지 않습니다. (라인에는 공통점이 없거나 공통점이 있습니다.) 따라서이 조건을 확인해야하지만, 문제를 해결하기로 선택한 방식의 인공물이 아닌 문제의 정당한 부분입니다. –