如何计算两条线的交点?

时间:2017-09-25 16:54:50

标签: python math geometry

我有以下细分线的终点。

第1行:

A = (X1, Y1)
B = (X2, Y2)

第2行:

C = (X3, Y3)
D = (X4, Y4)

我想得到这两个线段的交点。

我试过这样:

def intersectionfn(l1,l2):

    x1,y1 = l1.src.x, l1.src.y
    x2,y2 = l1.dst.x, l1.dst.y
    x3,y3 = l2.src.x, l2.src.y
    x4,y4 = l2.dst.x, l2.dst.y

    try:
        xnum = float(((x1*y2-y1*x2)*(x3-x4))-((x1-x2)*(x3*y4-y3*x4)))
        xden = float(((x1-x2)*(y3-y4))-((y1-y2)*(x3-x4)))
        #print xnum, xden
        xcoor = float(xnum)/xden
        #print xcoor
        ynum = float((x1*y2-y1*x2)*(y3-y4) - (y1-y2)*(x3*y4-y3*x4))
        yden = float((x1-x2)*(y3-y4)-(y1-y2)*(x3-x4))
        #print ynum, yden
        ycoor = float(ynum)/yden
        #print ycoor
        return Point(xcoor,ycoor)
    except:
        print "No intersection.. 0/0 attempted"

但是我得到了无限长线的输出。我不知道如何为线段找到它。如果有任何算法/数学规则,请向我建议。我会实现它。

1 个答案:

答案 0 :(得分:0)

交叉乘积PQ x QR的符号(我们称之为Cross(P,Q,R))告诉您P是否在通过QR的线的左侧或右侧。

如果A和B位于CD的两侧,则两个段将相交,而C和D位于AB的相对侧。

此外,函数Cross是线性的,因此Cross((1-t)A + t B,C,D)=(1-t)交叉(A,C,D)+ t交叉(B,C) ,D)。如果计算取消此表达式的t,则会引导您到交点。