Мне нужен алгоритм, который может найти пересечение двух двумерных линий. Каждая строка будет представлена в виде точкой на линии и dx/dy параллельного вектора. Я попытался параметризовать каждую строку и решить систему уравнений для решения параметризованной переменной, которую я мог бы подключить к параметрическому уравнению линий и получить свой x/y, но моя попытка не удалась. Есть идеи? Я программирую на Python, но язык не имеет большого значения.Как найти пересечение двух линий, заданных точкой на каждой строке и параллельным вектором
ответ
Вы в основном должны решить следующее уравнение:
х = 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 б × ду
Теперь, таким образом, только вопрос, чтобы определить, как t
u
или (вам не нужно вычислить оба) , и затем вставьте в формулу выше.Так
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)
Если бы я мог ответить на ваш ответ 10 раз. Большое спасибо. –
«но моя попытка потерпела неудачу» - если бы там был какой-то способ, который мы могли бы увидеть вашу попытку? Это была бы полезная информация для нас, да? :-) – paxdiablo
Что вы подразумеваете под «dx/dy параллельного вектора»? Вы имеете в виду, что вам задан наклон линии (поскольку параллельные линии имеют один и тот же наклон) или вектор направления линии или что-то еще? И нам нужно видеть доказательства вашей работы над проблемой, если ничего другого, чтобы мы могли видеть, что не удалось. –
@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. –