题解 | 两直线交点

两直线交点

https://www.nowcoder.com/practice/b14130882e704fd6aa57f8762ae17bac

class Point:
    def __init__(self, x=0.0, y=0.0):
        self.x = x
        self.y = y

class Line:
    def __init__(self, point_a=None, point_b=None):
        self.point_A = point_a if point_a is not None else Point()
        self.point_B = point_b if point_b is not None else Point()

def find_meeting_point(line_A, line_B):
    # TODO: 求直线 line_A 与 line_B 的交点
    Kab = -1.0
    Kcd = -1.0

    # AB铅垂线
    if (line_A.point_B.x-line_A.point_A.x)==0:
        Kab = 999.09
        Bab = 999.09
    else:
        Kab = (line_A.point_B.y - line_A.point_A.y)/(line_A.point_B.x-line_A.point_A.x)
        Bab = line_A.point_A.y - Kab * line_A.point_A.x

    # cd铅垂线
    if (line_B.point_B.x-line_B.point_A.x)==0:
        Kcd = 999.09
        Bab = 999.09
    else:
        Kcd = (line_B.point_B.y - line_B.point_A.y)/(line_B.point_B.x-line_B.point_A.x)
        Bcd = line_B.point_A.y - Kcd * line_B.point_A.x

    # 平行
    if (Kab == Kcd):
        return Point(-1,-1)
    # 有唯一交点
    else:
        # AB铅垂线
        if Kab == 999.09:
            Y = Kcd * line_A.point_A.x + Bcd
            return Point(line_A.point_A.x, Y)
        # CD铅垂线
        elif Kcd == 999.09:
            Y = Kab * line_B.point_A.x + Bab
            return Point(line_B.point_A.x, Y)
        # 无铅垂线
        else:
            X = -1*(Bab-Bcd)/(Kab-Kcd)
            Y = Kab*X+Bab
            return Point(X,Y)




    return Point(-1,-1)


def main():
    data = list(map(float, input().split()))
    data.extend(list(map(float, input().split())))
    A = Point(data[0], data[1])
    B = Point(data[2], data[3])
    C = Point(data[4], data[5])
    D = Point(data[6], data[7])
    AB = Line(A, B)
    CD = Line(C, D)
    ans = find_meeting_point(AB, CD)
    print("{:.6f} {:.6f}".format(ans.x,ans.y))

if __name__ == "__main__":
    main()

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务