MATLAB 版烟花

在这里插入图片描述
随便写了个简单的烟花小程序(捂脸)

function fireWorks
fg=gcf;
fg.NumberTitle='off';
fg.MenuBar='none';
fg.Resize='off';
fg.Position=[100 100 500 500];
fg.Name='fireworks';

ax=axes(fg);
ax.Position=[0 0 1 1];
ax.XLim=[0 100];
ax.YLim=[0 100];
ax.Color=[0 0 0];
hold(ax,'on');

baseFw.rRange=[0.6 1.2];
baseFw.centerPosLim=[10 90,40 90];
baseFw.pntNum=120:200;
baseFw.cenNum=[2 6];
baseFw.colorLst=...
   [0.9569    0.4235    0.3216
    0.8196    0.8627    0.4863
    0.2157    0.6980    0.6784
    0.4706    0.6549    0.9373
    0.7333    0.8902    0.8980
    0.7020    0.8549    1.0000
    0.9373    0.9255    0.7490
    0.5451    0.7373    0.3804];
baseFw.brightDecay=0.98;
baseFw.pntSizeLim=[1 5];
baseFw.gv=0.013;

    function fw=createFWobj(~,~)
        fw.Num=baseFw.pntNum(randi(length(baseFw.pntNum)));
        fw.Rmax=rand(1,1).*(baseFw.rRange(2)-baseFw.rRange(1))+baseFw.rRange(1);
        fw.R=rand(fw.Num,1).*fw.Rmax;
        fw.theta=rand(fw.Num,1).*2.*pi;
        fw.cenPos=[randi(baseFw.centerPosLim(2)-baseFw.centerPosLim(1))+baseFw.centerPosLim(1),...
            randi(baseFw.centerPosLim(4)-baseFw.centerPosLim(3))+baseFw.centerPosLim(3)];
        fw.Pos=[cos(fw.theta),sin(fw.theta)].*fw.R+fw.cenPos;
        fw.Dir=fw.Pos-fw.cenPos;
        fw.color=baseFw.colorLst(randi(size(baseFw.colorLst,1)),:);
        fw.BD=baseFw.brightDecay;
        fw.gv=baseFw.gv;
        fw.pntSize=randi(baseFw.pntSizeLim(2)-baseFw.pntSizeLim(1))+baseFw.pntSizeLim(1);
    end

    function [fwSet,fwPlotSet]=createFWgroup(~,~)
        cenNum=randi(baseFw.cenNum(2)-baseFw.cenNum(1))+baseFw.cenNum(1);
        fwSet.Len=cenNum;
        for ii=1:cenNum
            fwSet.(['fw',num2str(ii)])=createFWobj();
            fwPlotSet.(['fw',num2str(ii)])=...
                scatter(fwSet.(['fw',num2str(ii)]).Pos(:,1),...
                        fwSet.(['fw',num2str(ii)]).Pos(:,2),...
                        fwSet.(['fw',num2str(ii)]).pntSize,'filled','CData',...
                        fwSet.(['fw',num2str(ii)]).color,'tag','fw');
        end 
    end
while 1
    [fwSet,fwPlotSet]=createFWgroup();
    for i=1:50
        for j=1:fwSet.Len
            set(fwPlotSet.(['fw',num2str(j)]),...
                'XData',i.*fwSet.(['fw',num2str(j)]).Dir(:,1)+fwSet.(['fw',num2str(j)]).cenPos(:,1),...
                'YData',i.*fwSet.(['fw',num2str(j)]).Dir(:,2)+fwSet.(['fw',num2str(j)]).cenPos(:,2)-i*i*(fwSet.(['fw',num2str(j)]).gv),...
                'CData',fwSet.(['fw',num2str(j)]).color.*(fwSet.(['fw',num2str(j)]).BD)^i);
        end
        pause(0.04)
    end
    delete(findobj('type','scatter'))
    pause(random('exponential',0.1))
end

end

猜你喜欢

转载自blog.csdn.net/slandarer/article/details/109788587