【Python】list 列表中递归插入数据

Python 递归补点

任务:

  1. Python 列表按某一个元素进行排序
  2. Python 递归插入补点, 列表相加
  3. Python OpenCV 显示插入点的效果

在这里插入图片描述

"""
任务:

1. Python 列表按某一个元素进行排序
2. Python 递归插入补点, 列表相加
3. Python OpenCV 显示插入点的效果

注: 本程序主要作为实例展示, 不推荐生产环境使用
"""

import cv2
import numpy as np

class CRecursionInsert(object):    
    def __init__(self):
        self.canvas = np.zeros((512, 512, 3), np.uint8)
        self.srcPtSet = [] # 原始点集
        pt = {
    
    }
        pt["x"]=50
        pt["y"]=50
        self.srcPtSet.append(pt)
        pt = {
    
    }
        pt["x"]=300
        pt["y"]=40
        self.srcPtSet.append(pt)
        pt = {
    
    }
        pt["x"]=400
        pt["y"]=300
        self.srcPtSet.append(pt)
        pt = {
    
    }
        pt["x"]=200
        pt["y"]=200
        self.srcPtSet.append(pt)
        print("原始点集: \n", self.srcPtSet)
        self.__show_pt_canvas("src", self.srcPtSet)
        
    def __show_pt_canvas(self, win_name:str, pt_list: list, color: tuple=(0, 255, 0), radius:int=3):
        cv2.namedWindow(win_name, cv2.WINDOW_NORMAL)
        _canvas = self.canvas.copy()
        # 将列表中的点显示出来
        for i in range(len(pt_list)-1):
            pt = (pt_list[i]["x"], pt_list[i]["y"])
            cv2.circle(_canvas, pt, radius, color, radius, 8, 0)
            if (len(pt_list)-1) > 1:
                pt2 = (pt_list[i+1]["x"], pt_list[i+1]["y"])
                cv2.line(_canvas, pt, pt2, color, 1, 8, 0)
                cv2.circle(_canvas, pt2, radius, color, radius, 8, 0)
        cv2.imshow(win_name, _canvas)

    def __recursion_insert(self, p1, p2, pt_list):
        pm = {
    
    }
        if (p2["x"]-p1["x"]>1):
            pm["x"] = int((p2["x"] + p1["x"]) * 0.5 + 0.5)
            pm["y"] = int((p2["y"] + p1["y"]) * 0.5 + 0.5)
            pt_list.append(pm)
            self.__recursion_insert(p1, pm, pt_list)
            self.__recursion_insert(pm, p2, pt_list)


    def process(self):
        def __take_x(elem):
            return elem["x"]

        # 按照 x 大小排序
        self.sortedPtSet = sorted(self.srcPtSet, key=__take_x)
        print("原始点集按照 x 从小到大排序后: \n", self.sortedPtSet)

        # 初始化插值算法
        insert_pt_list = []
        for ix in range(len(self.sortedPtSet)-1):
            pt1 = self.sortedPtSet[ix]
            pt2 = self.sortedPtSet[ix+1]
            pt_list = []
            self.__recursion_insert(pt1, pt2, pt_list)
            insert_pt_list += pt_list
        
        # 对插入后的 list 进行排序
        insert_pt_list = sorted(
            sorted(insert_pt_list, key=__take_x), key=__take_x)        
        # for i in range(50):
        #     print(insert_pt_list[i], " ")
        
        # 显示插值后的点集
        self.__show_pt_canvas("result", pt_list=insert_pt_list, color=(0, 255, 255), radius=1)        
        cv2.waitKey(0)
        cv2.destroyAllWindows()


if __name__ == '__main__':
    obj = CRecursionInsert()
    obj.process()
原始点集: 
 [{
    
    'x': 50, 'y': 50}, {
    
    'x': 300, 'y': 40}, {
    
    'x': 400, 'y': 300}, {
    
    'x': 200, 'y': 200}]
原始点集按照 x 从小到大排序后: 
 [{
    
    'x': 50, 'y': 50}, {
    
    'x': 200, 'y': 200}, {
    
    'x': 300, 'y': 40}, {
    
    'x': 400, 'y': 300}]

猜你喜欢

转载自blog.csdn.net/zhoujinwang/article/details/129817754