请尊重原创劳动成果
转载请注明本文链接
及文章作者:slandarer

2023年到了!!
画个简简单单的烟花~
我保证再写几期好玩的就开始写建模算法啥的,毕竟美赛也快到了。

代码依旧是各种矩阵运算,建议17b之后版本使用,首先看一眼烟花效果哈:

打开网易新闻 查看精彩图片

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

随机颜色随机数量烟花,另外还添加了系统自带的音效,如果觉得不好听可以扔掉或者换点其他音效。

绘图原理

渐变的烟花是使用fill函数绘制的,只需要将最后一个数值设置为nan就能由面变成线:

x=linspace(1,10,30);
y=sin(x);
y(end)=NaN;
fill(x,y,y,'EdgeColor','interp','LineWidth',10);

打开网易新闻 查看精彩图片
完整代码function fireWorks2023
% @author : slandarer

% 坐标区域初始化及修饰
ax=gca;hold on;fig=gcf;
set(ax,'XLim',[0,20],'YLim',[0,20],'PlotBoxAspectRatio',[1,1,1],...
'XColor','none','YColor','none','Color',[0,0,0],'Tag',char([100,105,115,112,...
40,39,20316,32773,58,115,108,97,110,100,97,114,101,114,39,41]));eval(ax.Tag)
fig.Position(1:2)=fig.Position(1:2)/5;
fig.Position(3:4)=fig.Position(3:4).*2;
% 基础数据
baseNum=100;
interpNum=15;
fwSound=load('splat.mat');
% 绘制星星
scatter(rand(1,50)*20,rand(1,50).*10+10,4,'white','filled','MarkerEdgeColor','none','MarkerFaceAlpha',.6)
% 循环烟花升空绽放过程
while true
randFW(baseNum,interpNum,rand(3,3)./2+.5,randi(3))
delete(findobj('type','patch'))
pause(.5)
end
function randFW(num1,num2,C,N)
randC=rand(N,2).*[20,10]+[0,8];
% 绘制升空过程
scHdl=scatter(randC(:,1),randC(:,2).*0,25,'filled','CData',C(1:N,:));
sound(fwSound.y(1:7200),fwSound.Fs/1.2)
for k=0:.02:1
pause(.02)
scHdl.YData=randC(:,2).*k;
drawnow;
end
delete(scHdl)
% 随机生成数据并绘制渐变烟花
randXSet=zeros(num2,num1,N);
randYSet=zeros(num2,num1,N);
for n=1:N
randTheta=rand(1,num1).*2.*pi;
randR=rand(1,num1).*3+2;
randX=cos(randTheta).*randR;
randY=sin(randTheta).*randR;
randX=randX.*linspace(0,1,num2)';
randY=randY.*linspace(0,1,num2)';
randX(end,:)=nan;
randY(end,:)=nan;
randXSet(:,:,n)=randX;
randYSet(:,:,n)=randY;
end
for n=1:N
for i=1:num1
fwHdl(n,i)=fill(randXSet(:,i,n)+randC(n,1),randYSet(:,i,n)+randC(n,2),...
linspace(0,1,num2),'EdgeColor','interp',...
'LineWidth',2,'EdgeAlpha',.9,'FaceVertexCData',C(n,:).*linspace(0,1,num2)');
end
end
sound(fwSound.y(7201:10001),fwSound.Fs)
% 烟花绽放过程
for k=.1:.05:1
for n=1:N
for i=1:num1
fwHdl(n,i).XData=randXSet(:,i,n).*k+randC(n,1);
fwHdl(n,i).YData=randYSet(:,i,n).*k+randC(n,2);
end
end
pause(.001)
drawnow;
end
end
end

打开网易新闻 查看精彩图片

祝大家新年快乐!祝大家新的一年里项目顺利,竞赛通通拿大奖,狂发sci!!

以上已经是完整代码了,如果懒得复制可公众号后台回复新年烟花2023获取完整代码的m文件。