之前在网上看到别人用opencv,pygame实现多种排序算法的可视化,十分有趣。参考文章:python实现排序算法过程的可视化
便通过冒泡排序进行尝试,简化了程序,主要尝试opencv可视化数据排序过程。
import numpy as np
import os
import cv2
class Dataseq():
WHITE = (255,255,255)
RED = (0,0,255)
BLACK = (0,0,0)
YELLOW = (0,127,255)
def __init__(self, data=None,sort_type='figure'):
self.sort_type=sort_type
self.interval=5
self.inter=2
if data==None:
print("there are no data to sort!!!")
os.exit()
else:
self.data=data
self.maxd=max(self.data)
self.mind=min(self.data)
self.getfigure()
self.Visualize()
self.sortdata()
def getfigure(self):
datanum=len(self.data)
maxd=max(self.data)
mind=min(self.data)
self.figure=np.full((500*(maxd-mind)+50, (datanum)*(self.interval+self.inter), 3), 255,dtype=np.uint8)
for i in range(len(self.data)):
self.figure[-50-(self.data[i]-mind)*500:,(i)*(self.interval+self.inter):(i)*(self.interval+self.inter)+self.interval]=self.YELLOW
def choice(self, i, j):
mind=self.mind
self.figure[-50-(self.data[i]-mind)*500:,(i)*(self.interval+self.inter):(i)*(self.interval+self.inter)+self.interval]=self.BLACK
self.figure[-50-(self.data[j]-mind)*500:,(j)*(self.interval+self.inter):(j)*(self.interval+self.inter)+self.interval]=self.BLACK
self.Visualize()
def change(self,i,j):
mind=self.mind
self.figure[-50-(self.data[i]-mind)*500:,(i)*(self.interval+self.inter):(i)*(self.interval+self.inter)+self.interval]=self.WHITE
self.figure[-50-(self.data[j]-mind)*500:,(j)*(self.interval+self.inter):(j)*(self.interval+self.inter)+self.interval]=self.WHITE
indata=self.data[i]
self.data[i]=self.data[j]
self.data[j]=indata
self.figure[-50-(self.data[i]-mind)*500:,(i)*(self.interval+self.inter):(i)*(self.interval+self.inter)+self.interval]=self.BLACK
self.figure[-50-(self.data[j]-mind)*500:,(j)*(self.interval+self.inter):(j)*(self.interval+self.inter)+self.interval]=self.BLACK
self.Visualize()
def Visualize(self):
figure1=self.figure
cv2.namedWindow('img',cv2.WINDOW_NORMAL)
cv2.imshow('img',figure1)
cv2.waitKey(1000)
"""
@staticmethod
颜色计算,目前没用
def GetColor_change(val, TOTAL1, TOTAL2):
return (120+val*255//(2*TOTAL1), 255-val*255//(2*TOTAL2), 0)
"""
def sortdata(self):
for di in range(len(self.data)):
for dj in range(len(self.data)-di-1):
self.choice(dj,dj+1)
if self.data[dj]>self.data[dj+1]:
self.change(dj,dj+1)
self.getfigure()
datat=Dataseq([7,9,1,2,3,4],'sort')
datat.Visualize()
cv2.destroyAllWindows()
通过opencv实现可视化,主要需要注意将排序数据转换为显示数据。figure矩阵为一个像素矩阵,其中通过多列像素来表示一个数据,然后根据数据大小决定该数据列的行数,产生同宽不同高的数据视图。最终赋予像素点色彩信息,完成显示工作。
声明
由于个人知识局限,所写的内容会存在错误,欢迎大家指出其中的问题,谢谢