import math


# 巷道间距


# 计算旋转角度
def calculate_route(point_1, point_2):
    a, b = point_1
    c, d = point_2
    return math.atan((d - b) / (c - a))


# 计算旋转坐标
def calculate_route_coordinate(point, route):
    x = point[0]
    y = point[1]
    x1 = x * math.cos(route) + y * math.sin(route)
    y1 = -x * math.sin(route) + y * math.cos(route)
    return (x1, y1)


def find_point_on_line(A, B, fraction):
    """
    计算线段AB上距离A点fraction长度处的点C的坐标。

    参数:
    A -- 点A的坐标，形式为(x1, y1)
    B -- 点B的坐标，形式为(x2, y2)
    fraction -- 线段AB上距离A点的比例（0到1之间）

    返回:
    点C的坐标，形式为(x, y)
    """
    x1, y1 = A
    x2, y2 = B

    # 使用线性插值计算C点的坐标
    x = x1 + (x2 - x1) * fraction
    y = y1 + (y2 - y1) * fraction

    return (x, y)


# 计算 a点到b点之间1/x处（距离a点）的c点坐标
def calculate_point_c(point_a, point_b, x):
    x_a, y_a = point_a
    x_b, y_b = point_b
    # 计算方向向量
    dx = x_b - x_a
    dy = y_b - y_a

    # 计算方向向量的模长
    distance_ab = math.sqrt(dx ** 2 + dy ** 2)

    # 计算单位方向向量
    unit_vector_x = dx / distance_ab
    unit_vector_y = dy / distance_ab

    # 计算点C的坐标
    x_c = x_a + (1 / x) * unit_vector_x
    y_c = y_a + (1 / x) * unit_vector_y

    return x_c, y_c


# 找线段之间某点的坐标
def rotate_point_around_another(point_a, point_b, a):
    x_a, y_a = point_a
    x_b, y_b = point_b
    """  
    旋转点A(x_a, y_a)围绕点B(x_b, y_b) a 弧度后的新坐标。  
    """
    # 将A点的坐标转换到以B点为原点的坐标系中
    dx = x_a - x_b
    dy = y_a - y_b

    # 旋转坐标
    x_prime = dx * math.cos(a) - dy * math.sin(a)
    y_prime = dx * math.sin(a) + dy * math.cos(a)

    # 将旋转后的坐标转换回原来的坐标系
    x_rotated = x_prime + x_b
    y_rotated = y_prime + y_b

    return x_rotated, y_rotated


def calculate_angle_with_x_axis(point1, point2):
    x1, y1 = point1
    x2, y2 = point2
    """
    计算线段(x1, y1)到(x2, y2)与x轴的夹角（以弧度为单位）。
    结果角度是从x轴正方向逆时针旋转到线段方向所经过的角度。
    """
    # 首先计算线段的斜率
    if x1 == x2:  # 避免除以零
        if y2 > y1:
            return math.pi / 2  # 垂直于x轴且向上
        elif y2 < y1:
            return -math.pi / 2  # 垂直于x轴且向下
        else:
            return 0  # 与x轴重合
    else:
        slope = (y2 - y1) / (x2 - x1)
        # 使用atan2计算角度，它返回从x轴正方向到点(y, x)的向量与x轴之间的夹角
        # 注意：atan2的参数顺序是(y的差, x的差)，即(y2-y1, x2-x1)
        angle_radians = math.atan2(y2 - y1, x2 - x1)
        return angle_radians


def get_color_by_layer(layer_id):
    return {
        '1': 53,
        '2': 83,
        '3': 133,
        '4': 173
    }.get(layer_id)


def min_distance_between_segments(seg1, seg2):
    """
    计算两条线段之间的最小距离（基于端点之间的最小距离）
    seg1, seg2: 线段的端点坐标，例如 [(x1, y1), (x2, y2)]
    """
    # 提取端点
    p1, p2 = seg1
    p3, p4 = seg2

    # 计算所有端点之间的距离
    dist1 = distance(p1, p3)
    dist2 = distance(p1, p4)
    dist3 = distance(p2, p3)
    dist4 = distance(p2, p4)

    # 返回最小距离
    return min(dist1, dist2, dist3, dist4)


def distance(p1, p2):
    """计算两点之间的距离"""
    return math.sqrt((p2[0] - p1[0]) ** 2 + (p2[1] - p1[1]) ** 2)


def symmetric_point(A, B):
    """
    计算点A相对于点B的对称点C的坐标

    参数:
    A -- 点A的坐标，形式为(x_a, y_a)
    B -- 点B的坐标，形式为(x_b, y_b)

    返回:
    点C的坐标，形式为(x_c, y_c)
    """
    x_a, y_a = A
    x_b, y_b = B

    x_c = 2 * x_b - x_a
    y_c = 2 * y_b - y_a

    return x_c, y_c
