1说明: 1。1代码来源:感谢原作者,并对代码进行修改,删除,注释。https:github。comVacantHuskyFouriervisualization 1。2直接上效果图:4种傅里叶波形(方波,锯齿波,半圆波,三角波)可视化效果。 1。3方波: 有功能调节的 1。4锯齿波: 1。5半圆波: 1。6三角波: 2代码: 2。1第1步:导入模块importpygame,math,time,random,osfrompygame。localsimportfromsysimportexit 2。2第2步:第2步:颜色初始化设定white(255,255,255)black(0,0,0)yellow(200,200,0)green(0,255,0)blue(0,0,255)red(255,0,0)圆圈的线条颜色,随机每次打开都不一样,来自于这里,你可以随意添加、删除colorlist〔blue,red,yellow,green,white〕 2。3第3步:第3步:参数设定窗口的宽和高WINDOWW1800WINDOWH1200onetime1时间流速(默认1)scale120缩放(默认120)FPS60帧率pointsize8点的大小startxy(300,int(WINDOWH2))圆的位置波形图参数bxy(600,startxy〔1〕)波形图原点坐标bscale1波形图缩放bcoloryellow波形图颜色blengthint(WINDOWW2)右侧波形图显示的长度,初始化500,可调节 2。4第4步:第4步:定义右侧波形函数defgetwave(name方波,maxi20):从这里可以获得一些特定的波形:paramname:波形的名字:方波,锯齿波,半圆波,三角波:parammaxi:用多少个三角函数来拟合它:return:该波形的参数列表maximax(maxi,1)fourierlist〔〕ifname方波:Amax4math。piforiinrange(1,maxi):fourierlist。append(〔Amax(2i1),2i1,0〕)elifname锯齿波:Amax1math。piforiinrange(1,maxi):fourierlist。append(〔Amaxi,i,0〕)elifname半圆波:Amax8(math。pi2)foriinrange(1,maxi):fourierlist。append(〔Amax(2i1)2,2i1,0〕)elifname三角波:Amax8(math。pi2)foriinrange(1,maxi):fourierlist。append(〔Amax((1)(i1))(2i1)2,2i1,0〕)else:raiseTypeError(未知的类型)returnfourierlist 2。5第5步:自己增加的第5步:终端输入需要查看波形print(请输入要查看的波形:方波,锯齿波,半圆波,三角波;请关闭窗口退出)ainput(本次输入后查看的波形是:)fourierlistgetwave(a) 2。6第6步:如果报错,就是这一步,字体需要自己提前弄好第6步:窗口初始化设定初始化pygamepygame。init()os。environ〔SDLVIDEOWINDOWPOS〕d,d(10,40)创建一个窗口screenpygame。display。setmode((WINDOWW,WINDOWH),pygame。DOUBLEBUF,32)pygame。display。setcaption(傅里叶变换可视化)显示中文字体,hwfs华文仿宋,可自行下载相关字体,放在根目录下fontpygame。font。Font(hwfs。ttf,40)字体变大后,注意上下行间距调整 2。7第7步:核心一,没动第7步:画圆函数classCircle():x,y0,0r0angle0anglev0color(0,0,0)初始化主圆的波形颜色fatherNonedefinit(self,r,anglev,angle,colorNone,fatherNone):self。rrself。anglevanglevself。angleangleself。fatherfatherifcolorisNone:主圆的波形颜色,随机选择self。colorrandom。choice(colorlist)else:self。colorcolordefsetxy(self,xy):self。x,self。yxydefgetxy(self):return(self。x,self。y)defsetxybyangle(self):self。xself。father。xself。rmath。cos(self。angle)scaleself。yself。father。yself。rmath。sin(self。angle)scaledefrun(self,steptime):ifself。fatherisnotNone:self。angleself。anglevsteptimeself。setxybyangle()defdraw(self,screen):colorantuple(map(lambdax:x3,self。color))画圆pygame。draw。circle(screen,self。color,(int(self。x),int(self。y)),pointsize)画轨道ifself。fatherisnotNone:pygame。draw。circle(screen,coloran,(int(self。father。x),int(self。father。y)),max(int(self。rscale),1),1)pygame。draw。line(screen,self。color,(int(self。father。x),int(self。father。y)),(int(self。x),int(self。y)),1) 2。8第8步:第8步:圆内嵌套圆函数classBoxin():ys〔〕defaddpoint(self,y):self。ys。append(y)iflen(self。ys)blength:self。ys。pop(0)defdraw(self,screen):画一个圆pygame。draw。circle(screen,bcolor,(bxy〔0〕,int(bxy〔1〕self。ys〔1〕scale)),pointsize)bllen(self。ys)foriinrange(bl1):pygame。draw。line(screen,bcolor,(bxy〔0〕int((bli)bscale),int(bxy〔1〕self。ys〔i〕scale)),(bxy〔0〕int((bli1)bscale),int(bxy〔1〕self。ys〔i1〕scale)),1) 2。9第9步:第9步:傅里叶圆的嵌套圆fourierlistsorted(fourierlist,keylambdax:x〔0〕,reverseTrue)supercircleCircle(0,0,0)supercircle。setxy(startxy)circlelist〔supercircle〕foriinrange(len(fourierlist)):pfourierlist〔i〕circlelist。append(Circle(p〔0〕,p〔1〕,p〔2〕,fathercirclelist〔i〕))bxBoxin()clockpygame。time。Clock() 2。10第10步:第10步:游戏主循环whileTrue:foreventinpygame。event。get():退出设置ifevent。typepygame。QUIT:exit()键盘参数设置elifevent。typeKEYDOWN:空格键退出ifevent。keyKESCAPE:exit()方位:,功能设定elifevent。keyKLEFTandonetime0。1:onetime0。9onetimemax(onetime,0。1)按方位键:,功能设定elifevent。keyKRIGHTandonetime10:onetime1。1按或者,功能设定elif(event。keyKEQUALSorevent。keyKPLUS)andscale800:scale1。1按,功能设定elifevent。keyKMINUSandscale0。001:scale0。9scalemax(scale,0。001)按字母l或L,功能设定elifevent。keyKlandbscale10:bscale1。1按字母k,功能设定elifevent。keyKkandbscale0。1:bscale0。9bscalemax(bscale,0。1)else:print(type(event。key),event。key)将背景图画上去screen。fill(black)运行fori,circleinenumerate(circlelist):circle。run(onetimeFPS)circle。draw(screen)lastcirclecirclelist〔1〕pygame。draw。line(screen,lastcircle。color,(int(lastcircle。x),int(lastcircle。y)),(int(bxy〔0〕),int(lastcircle。y)),1)画波形bx。addpoint((lastcircle。ybxy〔1〕)scale)bx。draw(screen)左上角画文字,注意字体变大后注意上下行间距调整textobjfont。render(可调节参数说明:,1,red)screen。blit(textobj,(10,10))textobjfont。render(键:加速减速,11,white)screen。blit(textobj,(10,55))textobjfont。render(键:放大缩小,1,white)screen。blit(textobj,(10,95))textobjfont。render(LK键:波形图放大缩小,1,white)screen。blit(textobj,(10,135))可变化的动态值textobjfont。render(注意变化后参数:,1,red)screen。blit(textobj,(int(WINDOWW2),10))textobjfont。render(时间速率:{:。3f},放大比例:{:。3f}。format(onetime,scale),1,green)screen。blit(textobj,(int(WINDOWW2),55))textobjfont。render(波形图放大比例:{:。3f}。format(bscale),1,green)screen。blit(textobj,(int(WINDOWW2),95))textobjfont。render(FPS:{}。format(clock。getfps()),1,green)screen。blit(textobj,(int(WINDOWW2),135))pygame。display。update()timepassedclock。tick(FPS) 3傅里叶: 3。1傅里叶: 傅里叶画像 3。2(17681830),法国著名数学家、物理学家,1817年当选为科学院院士,1822年任该院终身秘书。 3。3傅里叶变换:他的主要成就。 可以参考外网的这篇文章,《傅里叶变换的意义和理解(通俗易懂)》。