天天看點

python——擷取三角形的3個坐标

任務描述

已知三角形的中點[row, col](高的中點),高與水準軸的夾角angle_label類别(0-35,每一類比前一類多10°),高width_label,底邊長bottom。計算三角形的三個角點的坐标。

代碼

def triangle_loc(row, col, angle, height, bottom):
    """
    根據 row, col, angle_label, width_label, bottom擷取三角坐标
    :param row: 抓取點坐标
    :param col:
    :param angle: 抓取角類别 0-35
    :param height: 抓取寬度
    :param bottom: 抓取三角的底
    :return: [[row1, col1], [row2, col2], [row3, col4]]
    """
    assert angle <= 35, 'angle out of index'
    angle *= (10 / 180) * math.pi   # 弧度
    k = math.tan(angle)     # 斜率

    dx_abs = height / 2 / pow(k**2 + 1, 0.5)
    dy_abs = abs(k * dx_abs)

    # 計算三角形定點的坐标
    if angle <= math.pi:
        if k >= 0:  # 一 象限
            pt1_x = col + dx_abs
            pt1_y = row - dy_abs
        else:       # 二象限
            pt1_x = col - dx_abs
            pt1_y = row - dy_abs

    else:
        if k >= 0:  # 三 象限
            pt1_x = col - dx_abs
            pt1_y = row + dy_abs
        else:       # 四 象限
            pt1_x = col + dx_abs
            pt1_y = row + dy_abs

    # 底邊中點的坐标
    pt_b_x = 2 * col - pt1_x
    pt_b_y = 2 * row - pt1_y

    # 底邊兩個端點的坐标
    if k == 0:
        dx_b_abs = 0
        dy_b_abs = bottom / 2
    else:
        k_b = -1 / k     # 底邊的斜率
        dx_b_abs = bottom / 2 / pow(k_b ** 2 + 1, 0.5)
        dy_b_abs = dx_b_abs * k_b

    pt2_x = pt_b_x + dx_b_abs
    pt2_y = pt_b_y - dy_b_abs

    pt3_x = pt_b_x - dx_b_abs
    pt3_y = pt_b_y + dy_b_abs

    triangle = np.array([
        [pt1_y, pt1_x],
        [pt2_y, pt2_x],
        [pt3_y, pt3_x]
    ])

    return triangle.astype(int)