有一个n边形(P0,P1,P2...Pn),每一边皆为垂直或者水平,现在给定数值k, 以P0为起点,将n边形的周长分成k段,每一段等长,请打印出所有的k等分点的坐标。

"""
有一个n边形(P0,P1,P2...Pn),每一边皆为垂直或者水平,现在给定数值k,
以P0为起点,将n边形的周长分成k段,每一段等长,请打印出所有的k等分点的坐标。
"""

分析:

       主要的思想就是先求出所有线段的总长,然后求出k等分线段的长度,然后去找k等分点的坐标。因为每个边不是垂直就是水平,这样我们就可以通过x或者y坐标的差值得到线段的长度,同时还需要考虑到线段的方向性(四个方向),终点到起点的线段长度也要单独的考虑。代码如下:

def k_equal(a_list, k):
    """
    K等分点
    :param a_list: n边形坐标列表
    :param k: 分成k段
    :return: 等分点的坐标
    """
    n = len(a_list)
    lines_len = 0  # 定义线段长度
    line_direction = []  # 1代表垂直上,2代表水平右,-1代表垂直下,-2代表水平左
    line_len_list = []  # 记录每段线段的长度

    for i in range(n-1):
        # 如果x坐标相等,就是垂直线段,y坐标差就是线段长度
        if a_list[i][0] == a_list[i + 1][0]:
            line_len = abs(a_list[i + 1][1] - a_list[i][1])
            lines_len += line_len
            line_len_list.append(line_len)
            if a_list[i + 1][1] - a_list[i][1] > 0:
                line_direction.append(1)
            else:
                line_direction.append(-1)
        # 如果y坐标相等,就是水平线段,x坐标差就是线段长度
        if a_list[i][1] == a_list[i + 1][1]:
            line_len = abs(a_list[i + 1][0] - a_list[i][0])
            lines_len += line_len
            line_len_list.append(line_len)
            if a_list[i + 1][0] - a_list[i][0] > 0:
                line_direction.append(2)
            else:
                line_direction.append(-2)

    # 加上终点到起点的线段
    if a_list[0][0] == a_list[n - 1][0]:
        line_len = abs(a_list[0][1] - a_list[n - 1][1])
        lines_len += line_len
        line_len_list.append(line_len)
        if a_list[0][1] - a_list[n - 1][1] > 0:
            line_direction.append(1)
        else:
            line_direction.append(-1)
    if a_list[0][1] == a_list[n - 1][1]:
        line_len = abs(a_list[0][0] - a_list[n - 1][0])
        lines_len += line_len
        line_len_list.append(line_len)
        if a_list[0][0] - a_list[n - 1][0] > 0:
            line_direction.append(2)
        else:
            line_direction.append(-2)

    equal_line = lines_len / k  # 等分线段长度
    tmp_equal_line = equal_line  # 存储等分线段长度
    m = len(line_direction)
    k_list = []  # 存储k等分点坐标

    for j in range(m):
        # 垂直上线段
        if line_direction[j] == 1:
            # 当前线段上有多个等分点的情况
            if equal_line <= line_len_list[j]:
                base = 0  # 记录当前k坐标起点
                while equal_line <= line_len_list[j]:
                    k_list.append((float(a_list[j][0]), a_list[j][1] + (equal_line + base)))
                    base += equal_line
                    line_len_list[j] -= equal_line
                    equal_line = tmp_equal_line
                equal_line = tmp_equal_line - line_len_list[j]
            else:
                equal_line -= line_len_list[j]
        # 垂直下线段
        elif line_direction[j] == -1:
            # 当前线段上有多个等分点的情况
            if equal_line <= line_len_list[j]:
                base = 0  # 记录当前k坐标起点
                while equal_line <= line_len_list[j]:
                    k_list.append((float(a_list[j][0]), a_list[j][1] - (equal_line + base)))
                    base += equal_line
                    line_len_list[j] -= equal_line
                    equal_line = tmp_equal_line
                equal_line = tmp_equal_line - line_len_list[j]
            else:
                equal_line -= line_len_list[j]
        # 水平右线段
        elif line_direction[j] == 2:
            # 当前线段上有多个等分点的情况
            if equal_line <= line_len_list[j]:
                base = 0  # 记录当前k坐标起点
                while equal_line <= line_len_list[j]:
                    k_list.append((a_list[j][0] + (equal_line + base), float(a_list[j][1])))
                    base += equal_line
                    line_len_list[j] -= equal_line
                    equal_line = tmp_equal_line
                equal_line = tmp_equal_line - line_len_list[j]
            else:
                equal_line -= line_len_list[j]
        # 水平左线段
        else:
            # 当前线段上有多个等分点的情况
            if equal_line <= line_len_list[j]:
                base = 0  # 记录当前k坐标起点
                while equal_line <= line_len_list[j]:
                    k_list.append((a_list[j][0] - (equal_line + base), float(a_list[j][1])))
                    base += equal_line
                    line_len_list[j] -= equal_line
                    equal_line = tmp_equal_line
                equal_line = tmp_equal_line - line_len_list[j]
            else:
                equal_line -= line_len_list[j]

    print(k_list)


alist = [(1, 2), (1, 3), (5, 3), (5, 2)]
k_equal(alist, 5)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值