Как вычислить точку пересечения двух строк в 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]