Нахождение пересечения двух векторных уравнений - PullRequest
1 голос
/ 18 июня 2010

Я пытался решить эту проблему и нашел уравнение, которое дает возможность ошибок с нулевым делением.Не самая лучшая вещь:

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)

Не уверен, что это сработает в некоторых случаях.Я не проверял это.

Мне нужно знать, как это сделать для значений, как в этом примере ai.

Спасибо.

Ответы [ 3 ]

1 голос
/ 03 июля 2010

Если вы выполните поиск Google для пересечения линий , вы найдете множество формул, которые не включают деление на одну из координат.Sputsoft один, на который ссылаются из Википедии, имеет хорошее объяснение алгоритма.

Что касается вашей математики, вы слишком быстро делитесь на h и i .Решение может быть достигнуто путем переноса деления.Например, умножьте уравнение для µh на i и на µi на h , чтобы получить два уравнения для µhi.Затем это дает окончательное уравнение для λ , эквивалентное вашему, но без потенциально незаконных делений:

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

Просто умножьте верх и низ вашего λ на hi .

0 голосов
/ 19 июня 2010

Вот решение с функцией 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])
0 голосов
/ 18 июня 2010

Убедитесь, что вектор d1 не параллелен (или почти параллелен) вектору d2 перед вашими вычислениями. Если они параллельны, ваши линии не пересекаются, и вы получаете ошибку с нулевым делением.

Используя ваши переменные, если (e i - f h) равно или близко к 0, ваши линии параллельны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...