matlab放烟花

用matlab放个烟花

跑程序之前,放个烟花庆祝一下
程序结束之前,再放个烟花庆祝一下
美滋滋

还可以做的改进有:

  1. 设置一个漂亮的背景代替目前的纯黑
  2. 目前烟花上升的速度太快,可以较慢上升,烟花熄灭,保持一段黑暗,然后满屏烟花,缓缓下坠,渐渐熄灭
  3. 烟花的形状还可以改一改,炸出一个漫天的丰满柳树
    程序转载自:http://www.matlabsky.com/thread-18210-1-1.html
function firework
% 烟花烟花满天飞
% CopyRight:xiezhh(谢中华)
% 2011.6.25

OldHandle = findobj( 'Type', 'figure', 'Tag', 'FireWork' ) ;
if ishandle(OldHandle)
 close(OldHandle) ;
end
% 图形窗口初始化
figure('units','normalized','position',[0.1 0.1 0.8 0.8],...
'menubar','none','name','烟花满天飞(谢中华制作)',...
'numbertitle','off','color',[0 0 0],'tag','FireWork');
% 烟花炸开前的初始位置
h0 = line(0,0,0,'marker','.',...
'markersize',18,...
'MarkerEdgeColor',[1 1 1],...
'MarkerFaceColor',[1 1 1],...
'color',[0 0 0]);
% 设置坐标系显示属性
axis equal
axis([-50 50 -50 50 0 100])
axis off
view(-42,22)

% 设置参数
rate = 1:-0.01:0;% 颜色衰减率
v0 = 45;% 烟花头初始速度
g = -9.8;% 重力加速度
usedtime = -v0/g;% 烟花头爆炸前所经历时间
zs = v0*usedtime+0.5*g*usedtime^2;%烟花头爆炸前达到的最高高度

theta = rand(250,1)*2*pi;% 各粒子速度的方位角
phi =rand(250,1)*2*pi-pi;% 各粒子速度的仰角
age = 20;% 粒子生存期
% 常用颜色矩阵
colormat = [1.0 0.5 0.5
 1.0 0.75 0.5
 1.0 1.0 0.5
 0.75 1.0 0.5
 0.5 1.0 0.5
 0.5 1.0 0.75
 0.5 1.0 1.0
 0.5 0.75 1.0
 0.5 0.5 1.0
 0.75 0.5 1.0
 1.0 0.5 1.0
 1.0 0.5 0.75];
% 随机产生各粒子对应的颜色序号
colorid = randsample(12,250,true);
% 粒子对应的颜色矩阵
colormat = colormat(colorid,:);
% 粒子颜色与背景色(夜色)的距离
colordist = sqrt(sum(colormat.^2,2));
v1 = 20; % 粒子的初始速度
k = 1; % 颜色衰减率初始序号

timerA = timer('TimerFcn',@TimerFcnA,...
 'executionmode','fixedspacing','Period',0.001);
start(timerA);
h = getappdata(gcf,'HandleParticle');
timerB = timer('TimerFcn',{@TimerFcnB},...
 'executionmode','fixedspacing','period',0.001);

%--------------------------------------------------------------------------
%  定时器回调函数(烟花头)
%--------------------------------------------------------------------------
function TimerFcnA(timerA,~)
ta = get(timerA,'TasksExecuted')*0.1;
if ta <= usedtime
  z = v0*ta+0.5*g*ta^2;
  set(h0,'zdata',z,...
  'MarkerEdgeColor',[1 1 1],...
 'MarkerFaceColor',[1 1 1])
  drawnow
  %pause(0.01)
else
 delete(h0)
 stop(timerA);
 x0 = zeros(2,250);
 y0 = zeros(2,250);
 z0 = zs*ones(2,250);
 h = line(x0,y0,z0,'marker','h',...
'markersize',12,...
'MarkerEdgeColor',[1 1 1],...
'MarkerFaceColor',[1 1 1],...
'color',[0 0 0]);
setappdata(gcf,'HandleParticle',h);
start(timerB);
end

end
%--------------------------------------------------------------------------
%  定时器回调函数(粒子)
%--------------------------------------------------------------------------
function TimerFcnB(timerB,~)
tb = get(timerB,'TasksExecuted')*0.15;
if age>0 && any(colordist>=0.05)
 colormat = colormat*rate(k);
 colordist = sqrt(sum(colormat.^2,2));
 for i = 1:250
xi = v1*cos(phi(i))*cos(theta(i))*tb;
yi = v1*cos(phi(i))*sin(theta(i))*tb;
zi = zs+v1*sin(phi(i))*tb+0.5*g*tb^2;
set(h(i),'XData',xi,'YData',yi,'ZData',zi,...
'MarkerEdgeColor',colormat(i,:),...
'MarkerFaceColor',colormat(i,:))
 end
 drawnow
 age = age-0.1;
 k = k+1;
else
 stop(timerB);
 delete(h)
end

end
%-------------------
end
  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值