Как вычислить точку пересечения двух строк в Python?
У меня есть две линии, которые пересекаются в одной точке. Я знаю конечные точки этих двух линий. Как вычислить точку пересечения в Python?
# Given these endpoints
#line 1
A = [X, Y]
B = [X, Y]
#line 2
C = [X, Y]
D = [X, Y]
# Compute this:
point_of_intersection = [X, Y]
4 ответов
В отличие от других предложений, это короткое и не использует внешние библиотеки, такие как numpy
. (Не то чтобы использование других библиотек плохо...приятно не нужно, особенно для такой простой проблемы.)
def line_intersection(line1, line2):
xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0])
ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) #Typo was here
def det(a, b):
return a[0] * b[1] - a[1] * b[0]
div = det(xdiff, ydiff)
if div == 0:
raise Exception('lines do not intersect')
d = (det(*line1), det(*line2))
x = det(d, xdiff) / div
y = det(d, ydiff) / div
return x, y
print line_intersection((A, B), (C, D))
и FYI, я бы использовал кортежи вместо списков для ваших очков. Е. Г.
A = (X, Y)
не могу стоять в стороне,
Итак, мы имеем линейную систему:
A1 * x + B1 * г = с1
А2 * x + B2 * г = с2
давайте сделаем это с правилом Крамера, поэтому решение можно найти в детерминантах:
x = Dx / D
y = Dy / D
где D является основным определителем системы:
A1 B1
А2 B2
и Dx и Dy можно найти из matricies:
C1 B1
C2 Б2
и
A1 C1
А2 C2
(обратите внимание, как C столбец, следовательно, заменяет coef. колонки x и y)
Итак, теперь python, для ясности для нас, чтобы не испортить вещи, давайте сделаем сопоставление между math и python. Мы будем использовать массив L
для хранения наших coefs A, B, C линейных уравнений и intestead довольно x
, y
мы [0]
, [1]
, но все равно. Таким образом, то, что я написал выше, будет иметь следующую форму в дальнейшем в коде:
на D
L1[0] L1[1]
L2[0] L2[1]
на Dx
L1[2] L1[1]
L2[2] L2[1]
на Dy
L1[0] L1[2]
L2[0] L2[2]
теперь перейти к кодированию:
line
- производит coefs A, B, C линейного уравнения на две точки при условии,intersection
- находит точку пересечения (если таковые имеются) двух линий coefs.
from __future__ import division
def line(p1, p2):
A = (p1[1] - p2[1])
B = (p2[0] - p1[0])
C = (p1[0]*p2[1] - p2[0]*p1[1])
return A, B, -C
def intersection(L1, L2):
D = L1[0] * L2[1] - L1[1] * L2[0]
Dx = L1[2] * L2[1] - L1[1] * L2[2]
Dy = L1[0] * L2[2] - L1[2] * L2[0]
if D != 0:
x = Dx / D
y = Dy / D
return x,y
else:
return False
пример использования:
L1 = line([0,1], [2,3])
L2 = line([2,3], [0,4])
R = intersection(L1, L2)
if R:
print "Intersection detected:", R
else:
print "No single intersection point detected"
Я не нашел интуитивного объяснения в интернете, поэтому теперь, когда я его разработал, вот мое решение. Это для бесконечных линий (что мне нужно), а не сегментов.
некоторые термины, которые вы, возможно, помните:
линия определяется как y = mx + b или Y = наклон * x + y-перехват
Slope = rise over run = dy / dx = высота / расстояние
Y-перехват-это место, где линия пересекает ось Y, где X = 0
дали эти определения, вот некоторые функции:
def slope(P1, P2):
# dy/dx
# (y2 - y1) / (x2 - x1)
return(P2[1] - P1[1]) / (P2[0] - P1[0])
def y_intercept(P1, slope):
# y = mx + b
# b = y - mx
# b = P1[1] - slope * P1[0]
return P1[1] - slope * P1[0]
def line_intersect(m1, b1, m2, b2):
if m1 == m2:
print ("These lines are parallel!!!")
return None
# y = mx + b
# Set both lines equal to find the intersection point in the x direction
# m1 * x + b1 = m2 * x + b2
# m1 * x - m2 * x = b2 - b1
# x * (m1 - m2) = b2 - b1
# x = (b2 - b1) / (m1 - m2)
x = (b2 - b1) / (m1 - m2)
# Now solve for y -- use either line, because they are equal here
# y = mx + b
y = m1 * x + b1
return x,y
вот простой тест между двумя (бесконечное) строки:
A1 = [1,1]
A2 = [3,3]
B1 = [1,3]
B2 = [3,1]
slope_A = slope(A1, A2)
slope_B = slope(B1, B2)
y_int_A = y_intercept(A1, slope_A)
y_int_B = y_intercept(B1, slope_B)
print(line_intersect(slope_A, y_int_A, slope_B, y_int_B))
выход:
(2.0, 2.0)
использование формулы из: https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection
def findIntersection(x1,y1,x2,y2,x3,y3,x4,y4):
px= ( (x1*y2-y1*x2)*(x3-x4)-(x1-x2)*(x3*y4-y3*x4) ) / ( (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4) )
py= ( (x1*y2-y1*x2)*(y3-y4)-(y1-y2)*(x3*y4-y3*x4) ) / ( (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4) )
return [px, py]