首页 > 试题广场 >

两直线交点

[编程题]两直线交点
  • 热度指数:8327 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}你需要实现一个函数,接受的参数为两条直线 AB、CD,返回值为点类型的两直线的交点。
\hspace{15pt}
\hspace{15pt}函数接收的参数为:
{\hspace{20pt}}_\texttt{1.}\,由点 A 和点 B 构成的直线 AB
{\hspace{20pt}}_\texttt{2.}\,由点 C 和点 D 构成的直线 CD

\hspace{15pt}你需要实现的函数的返回值为:
\hspace{23pt}\bullet\,由直线 AB 和直线 CD 相交而得到的交点 P。若两直线交点不唯一,则返回点 (-1,-1)

输入描述:
\hspace{15pt}提供输入格式只是方便您在代码出错时进行调试,你只需要按照题目描述实现函数即可,并不需要关心数据的实际输入格式。

\hspace{15pt}输入包含两行:
\hspace{23pt}\bullet\,第一行包含四个正整数,分别为点 A 的横纵坐标的点 B 的横纵坐标。
\hspace{23pt}\bullet\,第二行包含四个正整数,分别为点 C 的横纵坐标的点 D 的横纵坐标。
\hspace{15pt}数据保证点 A 和点 B 不重合,点 C 和点 D 不重合,且若交点 P 存在则其横纵坐标的绝对值均在 10^4 以内。


输出描述:
\hspace{15pt}提供输出格式只是方便您在代码出错时进行调试,你只需要按照题目描述实现函数即可,并不需要关心数据的实际输出格式。

\hspace{15pt}输出一行两个实数,分别为直线 AB 直线 CD 交点 P 的横纵坐标。特别的,如果两直线交点不唯一,则输出  \text{-1 -1}
\hspace{15pt}注意,只要您的答案与标准答案之差在 10^{-6} 以内,就会被认为是正确的。
示例1

输入

0 0 1 1
0 2 2 0

输出

1.000000 1.000000

说明


按照输入格式,点 A 为 (0,0)点 B 为 (1,1)点 C 为 (0,2)点 D 为 (2,0)
图中绿线表示直线 AB,红线表示直线 CD,两直线交于点 P (1,1),此时点 P 与点 B 重合。
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 的交点
    #分类讨论,先求斜率,按斜率是否存在分类(看分母),然后求交点
    if line_A.point_A.x - line_A.point_B.x != 0 and  line_B.point_A.x - line_B.point_B.x != 0:
        k_1 = (line_A.point_A.y - line_A.point_B.y)/(line_A.point_A.x - line_A.point_B.x)
        k_2 = (line_B.point_A.y - line_B.point_B.y)/(line_B.point_A.x - line_B.point_B.x)
        b_1 = line_A.point_A.y - k_1*line_A.point_A.x
        b_2 = line_B.point_A.y - k_2*line_B.point_A.x

        if k_1 == k_2:
            return Point(-1, -1)
        else:
            x = (b_2-b_1)/(k_1-k_2)
            y = k_1*x + b_1
            return Point(x, y)
    elif line_A.point_A.x - line_A.point_B.x != 0 and  line_B.point_A.x - line_B.point_B.x == 0:
        k_1 = (line_A.point_A.y - line_A.point_B.y)/(line_A.point_A.x - line_A.point_B.x)
        b_1 = line_A.point_A.y - k_1*line_A.point_A.x
        return Point(line_B.point_A.x,k_1*line_B.point_A.x+b_1)

    elif line_A.point_A.x - line_A.point_B.x == 0 and  line_B.point_A.x - line_B.point_B.x != 0:
        k_2 = (line_B.point_A.y - line_B.point_B.y)/(line_B.point_A.x - line_B.point_B.x)
        b_2 = line_B.point_A.y - k_2*line_B.point_A.x
        return Point(line_A.point_A.x,k_2*line_A.point_A.x+b_2)
    else:
        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(f"{ans.x} {ans.y}")

if __name__ == "__main__":
    main()
发表于 2026-01-28 11:36:20 回复(0)
def find_meeting_point(line_A, line_B):
    # TODO: 求直线 line_A 与 line_B 的交点
    """使用向量法求直线交点"""
    # 提取坐标
    x1, y1 = line_A.point_A.x, line_A.point_A.y
    x2, y2 = line_A.point_B.x, line_A.point_B.y
    x3, y3 = line_B.point_A.x, line_B.point_A.y
    x4, y4 = line_B.point_B.x, line_B.point_B.y
    
    # 计算分母
    denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)
    
    # 检查是否平行
    if abs(denominator) < 1e-10:
        return Point(-1, -1)  # 平行或重合
    
    # 计算交点坐标
    numerator_x = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4)
    numerator_y = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4)
    
    x = numerator_x / denominator
    y = numerator_y / denominator
    
    return Point(x, y)

发表于 2025-10-29 19:46:45 回复(0)