新的一年就要到了,祝大家元旦快乐,新的一年里顺风顺水顺财神,文章投的都中,奖金基金kuku申请成功,今天带来一款完成度比较高的烟花代码,带字幕特效,为新的一年接风洗尘~:
文字都是可以换的,也可以更多句话,只需要修改STR
元胞数组内的内容:
if nargin<1STR={'MATLABer','元旦快乐'};
end
改点字过年的时候还可以接着用哈哈哈哈。
完整代码
完整代码有点长,日后该代码如果有更新可以去我的gitee仓库进行查看。
function subtitleFireworks(STR)
% Copyright (c) 2023, Zhaoxu Liu / slandarer
if nargin<1STR={'MATLABer','元旦快乐'};
endfwSound=load('splat.mat');
% 循环构建文段矩阵
STRMX{length(STR)}=[];
STRMY{length(STR)}=[];
for i=1:length(STR)string=STR{i};CaptionMat=zeros(25*length(string),25);for j=1:length(string)CaptionMat(25*(j-1)+1:25*j,:)=getWordMatrix(string(j));end[XMesh,YMesh]=find(CaptionMat~=0);sizeSTRM=size(CaptionMat);STRMX{i}=(XMesh-sizeSTRM(1)/2)./12.5;STRMY{i}=(YMesh-sizeSTRM(2)/2)./12.5;
endfig=figure('units','normalized','position',[.1,.1,.5,.8],...'UserData',[98,121,32,115,108,97,110,100,97,114,101,114]);
axes('parent',fig,'NextPlot','add','Color',[0,0,0],...'DataAspectRatio',[1,1,1],'XLim',[-100,100],'YLim',[0,200],'Position',[0,0,1,1]);
disp(char(fig.UserData))
% 绘制一些静态装饰
if true
starX=rand(1,50).*200-100;starY=rand(1,50).*110+90;
scatter(starX,starY,40,'white','filled','MarkerEdgeColor','none','MarkerFaceAlpha',.1)
scatter(starX,starY,4,'white','filled','MarkerEdgeColor','none','MarkerFaceAlpha',.9)
for i=1:20skyscraper(5+i*10-110+2,rand([1,1])*20+30,[47,46,70]./255./4,[253,243,177]./255./4)skyscraper(5+i*10-110,rand([1,1])*25+15,[47,46,70]./255,[253,243,177]./255)
end
end%% ========================================================================
% 主循环
for i=length(STR)+1:99indSTRM=mod(i-1,length(STR)+2)+1;if length(STR)+1==indSTRM||length(STR)+2==indSTRMdrawFireworks()elsedrawWordMatrix(indSTRM)end
end
%% ========================================================================
% 一些静态绘制函数function skyscraper(X,Y,C1,C2)W=4.6;H=50;fill([X-W,X+W,X+W,X-W],[Y,Y,Y+H,Y+H]-H,C1)[XW,YW]=meshgrid([-1.9,1.9],linspace(.5,50-1.5,15));CMat=C2.*(rand([length(XW(:)),1])>.5);scatter(XW(:)+X,YW(:)+Y-H-1.5,35,'filled','CData',CMat,'Marker','s','MarkerEdgeColor','none')end
%% ========================================================================
% 一些动态绘制函数function drawWordMatrix(N)drawBullet(0,140,[1,1,1]);wordHdl1=scatter(STRMX{N},STRMY{N}+140,15,'filled','CData',[1,1,1],'Marker','s','MarkerEdgeColor','none','MarkerFaceAlpha',.5);wordHdl2=scatter(STRMX{N},STRMY{N}+140,15,'filled','CData',[1,1,1],'Marker','s','MarkerEdgeColor','none');set(gca,'Color',[1,1,1]./8);for ii=linspace(2,30,30)wordHdl1.XData=STRMX{N}.*(ii-1);wordHdl1.YData=STRMY{N}.*(ii-1)+140;wordHdl2.XData=STRMX{N}.*ii;wordHdl2.YData=STRMY{N}.*ii+140;set(gca,'Color',[1,1,1]./8*(1-ii/30));drawnow;pause(.05)enddelete(wordHdl1)delete(wordHdl2)endfunction drawBullet(X,Y,C)YY=linspace(0,-12,20);XX=sin(YY)./8;XX=XX-XX(1)+X;Alp=linspace(1,.01,20);Siz=linspace(45,8,20);bulletHdl=scatter(XX,YY,'filled','CData',C,'AlphaData',Alp,'SizeData',Siz,'MarkerFaceAlpha','flat');sound(fwSound.y(1:7200),fwSound.Fs/1.2)for ii=linspace(0,Y,30)YY=linspace(0,-12,20)+ii;XX=sin(linspace(0,-12,20)+ii/2)./8;XX=XX-XX(1)+X;bulletHdl.XData=XX;bulletHdl.YData=YY;drawnow;pause(.06)enddelete(bulletHdl)sound(fwSound.y(7201:10001),fwSound.Fs)endfunction drawFireworks(~,~)% Copyright (c) 2023, Zhaoxu Liu / slandarerYY=linspace(0,-12,20);XX=sin(YY)./8;XX=XX-XX(1);X=rand([3,1]).*200-100;Y=rand([3,1]).*80+90;C=rand(3,3)./2+.5;Alp=linspace(1,.01,20);Siz=linspace(45,8,20);bulletHdl1=scatter(XX+X(1),YY,'filled','CData',C(1,:),'AlphaData',Alp,'SizeData',Siz,'MarkerFaceAlpha','flat');bulletHdl2=scatter(XX+X(2),YY,'filled','CData',C(2,:),'AlphaData',Alp,'SizeData',Siz,'MarkerFaceAlpha','flat');bulletHdl3=scatter(XX+X(3),YY,'filled','CData',C(3,:),'AlphaData',Alp,'SizeData',Siz,'MarkerFaceAlpha','flat');sound(fwSound.y(1:7200),fwSound.Fs/1.2)for ii=linspace(0,1,30)YY1=linspace(0,-12,20)+ii*Y(1);XX1=sin(linspace(0,-12,20)+ii*Y(1)/2)./8;XX1=XX1-XX1(1)+X(1);YY2=linspace(0,-12,20)+ii*Y(2);XX2=sin(linspace(0,-12,20)+ii*Y(2)/2)./8;XX2=XX2-XX2(1)+X(2);YY3=linspace(0,-12,20)+ii*Y(3);XX3=sin(linspace(0,-12,20)+ii*Y(3)/2)./8;XX3=XX3-XX3(1)+X(3);bulletHdl1.XData=XX1;bulletHdl1.YData=YY1;bulletHdl2.XData=XX2;bulletHdl2.YData=YY2;bulletHdl3.XData=XX3;bulletHdl3.YData=YY3;drawnow;pause(.06)enddelete(bulletHdl1);delete(bulletHdl2);delete(bulletHdl3)sound(fwSound.y(7201:10001),fwSound.Fs)T=rand([1,300]).*2.*pi;R=rand([1,300]).*1+1;XF=cos(T).*R;YF=sin(T).*R;K=linspace(1,2,10).';Alp=linspace(.01,.7,10).'.*ones(1,100);Alp=Alp(:);Siz=linspace(4,40,10).'.*ones(1,100);Siz=Siz(:);R2=(XF.*K).^2+(YF.*K).^2;XXF=XF.*K;YYF=YF.*K-R2./90;XXF1=XXF(:,1:100);XXF1=XXF1(:);YYF1=YYF(:,1:100);YYF1=YYF1(:);XXF2=XXF(:,101:200);XXF2=XXF2(:);YYF2=YYF(:,101:200);YYF2=YYF2(:);XXF3=XXF(:,201:300);XXF3=XXF3(:);YYF3=YYF(:,201:300);YYF3=YYF3(:);fireworksHdl1=scatter(XXF1+X(1),YYF1+Y(1),'filled','CData',C(1,:),'AlphaData',Alp,'SizeData',Siz,'MarkerFaceAlpha','flat');fireworksHdl2=scatter(XXF2+X(2),YYF2+Y(2),'filled','CData',C(2,:),'AlphaData',Alp,'SizeData',Siz,'MarkerFaceAlpha','flat');fireworksHdl3=scatter(XXF3+X(3),YYF3+Y(3),'filled','CData',C(3,:),'AlphaData',Alp,'SizeData',Siz,'MarkerFaceAlpha','flat');set(gca,'Color',(C(1,:)+C(1,:)+C(1,:))./30);for ii=linspace(2,20,30)XXF(1:end-1,:)=XXF(2:end,:);XXF(end,:)=XF.*ii;R2=(XF.*ii).^2+(YF.*ii).^2;YYF(1:end-1,:)=YYF(2:end,:);YYF(end,:)=YF*ii-R2./90;XXF1=XXF(:,1:100);XXF1=XXF1(:);YYF1=YYF(:,1:100);YYF1=YYF1(:);XXF2=XXF(:,101:200);XXF2=XXF2(:);YYF2=YYF(:,101:200);YYF2=YYF2(:);XXF3=XXF(:,201:300);XXF3=XXF3(:);YYF3=YYF(:,201:300);YYF3=YYF3(:);fireworksHdl1.XData=XXF1+X(1);fireworksHdl1.YData=YYF1+Y(1);fireworksHdl2.XData=XXF2+X(2);fireworksHdl2.YData=YYF2+Y(2);fireworksHdl3.XData=XXF3+X(3);fireworksHdl3.YData=YYF3+Y(3);set(gca,'Color',(C(1,:)+C(1,:)+C(1,:))./30*(1-ii/20));drawnow;pause(.02)enddelete(fireworksHdl1);delete(fireworksHdl2);delete(fireworksHdl3)end
%% ========================================================================% 文字矩阵生成函数function wordMatrix=getWordMatrix(CHAR)% Copyright (c) 2023, Zhaoxu Liu / slandarerfigGWM=figure('units','pixels','position',[20 20 160 160],...'Numbertitle','off','Color',[1 1 1],'resize','off',...'visible','off','menubar','none');axGWM=axes('Units','pixels','parent',figGWM,'Color',[1 1 1],...'Position',[0 0 160 160],'XLim',[0 16],'YLim',[0 16],...'XColor',[1 1 1],'YColor',[1 1 1],'NextPlot','add');text(axGWM,8,8.5,CHAR,'HorizontalAlignment','center','FontSize',120)saveas(figGWM,['.\',CHAR,'.png']);pic=imread(['.\',CHAR,'.png']);delete(['.\',CHAR,'.png']);delete(axGWM);set(figGWM,'Visible','on');close all[rowMax,colMax,~]=size(pic);picData=pic(:,:,1)<125;wordMatrix=zeros(25,25);% 统计每个像素内点数确定黑色还是白色for ii=1:25rowLim=round([ii-1,ii]./25.*rowMax);rowLim(rowLim==0)=1;for jj=1:25colLim=round([jj-1,jj]./25.*colMax);colLim(colLim==0)=1;wordMatrix(ii,jj)=sum(sum(picData(rowLim(1):rowLim(2),colLim(1):colLim(2))));endendwordMatrix(wordMatrix<10)=0;wordMatrix=wordMatrix';wordMatrix=wordMatrix(:,end:-1:1);end
end