2017-01-23 16 views
0

Мне нужен алгоритм, который может найти пересечение двух двумерных линий. Каждая строка будет представлена ​​в виде точкой на линии и dx/dy параллельного вектора. Я попытался параметризовать каждую строку и решить систему уравнений для решения параметризованной переменной, которую я мог бы подключить к параметрическому уравнению линий и получить свой x/y, но моя попытка не удалась. Есть идеи? Я программирую на Python, но язык не имеет большого значения.Как найти пересечение двух линий, заданных точкой на каждой строке и параллельным вектором

+1

«но моя попытка потерпела неудачу» - если бы там был какой-то способ, который мы могли бы увидеть вашу попытку? Это была бы полезная информация для нас, да? :-) – paxdiablo

+0

Что вы подразумеваете под «dx/dy параллельного вектора»? Вы имеете в виду, что вам задан наклон линии (поскольку параллельные линии имеют один и тот же наклон) или вектор направления линии или что-то еще? И нам нужно видеть доказательства вашей работы над проблемой, если ничего другого, чтобы мы могли видеть, что не удалось. –

+0

@paxdiablo - wow so salty. Но конечно. Я просто не включил его, потому что это было долго и плохо. Я начал с 'x = x1 + t1 * dx1, y = y1 + t1 * dy1, x = x2 + t2 * dx2, y = y2 + t2 * dy2. после решения системы уравнений I закончился t2 = (x2dy1-x1dy1-y1y2dx1)/(dy2dy1-dx1dy2). 'Когда я попытался использовать значения:' (x1, y1) = (0,0), (x2, y2) = (1,1), (dx1, dy1) = (1,0), (dx2, dy2) = (0, -1) 'Я получил 0 в нижней части уравнения t2. –

ответ

2

Вы в основном должны решить следующее уравнение:

х = 0, а + дх × т
у = у 0, а + ду × т
х = х 0, б + дх б × ¯u
у = у 0, б + д б × у

Или:

х 0, а + де в × т = х 0, б + де б × у
x 0, a + dx a × t = x 0, b + де б × у

Теперь, если вы делаете некоторые алгебраические манипуляции, вы увидите, что:

т = д б × (х 0, б -x 0, а) -dx б × (у 0, б -y 0, а)/д
и = ду × (х 0, б -x 0, а) -dx × (у 0, б -y 0, а)/д; где
d = дх × ду б -dx б × ду

Теперь, таким образом, только вопрос, чтобы определить, как 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) 
+1

Если бы я мог ответить на ваш ответ 10 раз. Большое спасибо. –