MATLAB新年烟花祝MATLABer新年快乐

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

考虑重力版

function fireWorks2023_g
% @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);
                    R2=(randXSet(:,i,n).*k).^2+(randYSet(:,i,n).*k).^2;
                    fwHdl(n,i).YData=randYSet(:,i,n).*k+randC(n,2)-R2./15;
                end
            end
            pause(.001)
            drawnow;
        end
    end
end

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

电脑比较好的可以试试这个3D版

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

function FireWorks3D
% @author : slandarer

ax=gca;hold on;grid on;view(-55,12)
ax.XLim=[0,20];
ax.YLim=[0,20];
ax.ZLim=[0,20];
ax.DataAspectRatio=[1,1,1];
ax.Projection='perspective';
ax.LooseInset=[0,0,0,0];
ax.Color=[0,0,0];
ax.Position=[-1/6,-1/6,1+1/3,1+1/3];
ax.XColor='none';
ax.YColor='none';
ax.ZColor='none';

fig=gcf;
fig.Position(1:2)=fig.Position(1:2)/5;
fig.Position(3:4)=fig.Position(3:4).*2;
fig.Color=[0,0,0];

[X,Y]=meshgrid(linspace(0,20,25));
scatter3(X(:),Y(:),X(:).*0+rand(length(X(:)),1)./10,5,'white','filled','MarkerEdgeColor','none','MarkerFaceAlpha',.6)

% 基础数据
baseNum=100;
interpNum=15;
fwSound=load('splat.mat');

while true
    randFW(baseNum,interpNum,rand(3,3)./2+.5,randi(3))
    delete(findobj('type','patch'))
    ax.View(1)=ax.View(1)+1;
    pause(.5)
    ax.View(1)=ax.View(1)+1;
end

    function randFW(num1,num2,C,N)
        randC=rand(N,3).*[16,16,10]+[2,2,8];
        % 绘制升空过程
        scHdl=scatter3(randC(:,1),randC(:,2),randC(:,3).*0,25,'filled','CData',C(1:N,:));
        sound(fwSound.y(1:7200),fwSound.Fs/1.2)
        for k=0:.02:1
            ax.View(1)=ax.View(1)+.5;
            pause(.02)
            scHdl.ZData=randC(:,3).*k;
            drawnow;
        end
        delete(scHdl)
        % 随机生成数据并绘制渐变烟花
        randXSet=zeros(num2,num1,N);
        randYSet=zeros(num2,num1,N);
        randZSet=zeros(num2,num1,N);
        for n=1:N
            randTheta=rand(1,num1).*2.*pi;
            randPhi=rand(1,num1).*pi;
            randR=rand(1,num1).*3+2;
            randX=cos(randTheta).*sin(randPhi).*randR;
            randY=sin(randTheta).*sin(randPhi).*randR;
            randZ=cos(randPhi).*randR;
            randX=randX.*linspace(0,1,num2)';
            randY=randY.*linspace(0,1,num2)';
            randZ=randZ.*linspace(0,1,num2)';
            randX(end,:)=nan;
            randY(end,:)=nan;
            randZ(end,:)=nan;
            randXSet(:,:,n)=randX;
            randYSet(:,:,n)=randY;
            randZSet(:,:,n)=randZ;
        end
        for n=1:N
            ax.View(1)=ax.View(1)+1;
            for i=1:num1
                fwHdl(n,i)=fill3(randXSet(:,i,n)+randC(n,1),randYSet(:,i,n)+randC(n,2),...
                    randZSet(:,i,n)+randC(n,3),linspace(0,1,num2),'EdgeColor','interp',...
                    'LineWidth',2,'EdgeAlpha',.5,'FaceVertexCData',C(n,:).*linspace(0,1,num2)');
            end
        end
        sound(fwSound.y(7201:10001),fwSound.Fs)
        % 烟花绽放过程
        for k=.1:.05:1
            ax.View(1)=ax.View(1)+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);
                    R2=(randXSet(:,i,n).*k).^2+(randYSet(:,i,n).*k).^2+(randZSet(:,i,n).*k).^2;
                    fwHdl(n,i).ZData=randZSet(:,i,n).*k+randC(n,3)-R2./20;
                end
            end
            pause(.001)
            drawnow;
        end
    end
end

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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

slandarer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值