使用matlab制作漂亮的烟花,核心实现在于烟花图式的控制和关于如何控制多支烟花的同时释放。烟花样式的呈现需要经过复杂的数学表达式生成,升级到发射的角度和位移事变公式等,而多支烟花的同时释放难题源于matlab对多线程的不支持,幸运的是,matlab有Timer定时器,这样,我们可以实现单线程的非阻塞式烟花齐放。先上一张烟花爆炸的图形。
程序还支持在爆炸过程中即时随机改变烟花颜色,实现五彩缤纷的效果。
在程序中,我们可以通过滚动条调整RBG动态调整烟花颜色,可以改变烟花爆炸的速度和烟花爆炸后的颗粒数量,此外,还有下落的加速度。在上侧菜单中,我们可以选择不同的爆炸风格图案,背景图片,颜色等。这些都是通过回调函数的触发动态改变。
下面附上程序源码,大家有觉得写得不好的地方或不理解的地方都可以在下面评论讨论。
function yanhuamoban()
clear all;
%定义全局变量
global ah ;%坐标轴句柄
global styleNum ;%爆炸图案样式
global multiColor; %多颜色变换
global color;%烟花颜色
global v0;%烟花爆炸速度
global n; %粒子数量
global g;%粒子重力加速度
%变量初始化开始
multiColor = 0;
styleNum = 3;
color = [1 1 0];
v0 = 250; %烟花爆炸时的速度
n = 2000;%粒子shumu
g=1000;
%变量初始化结束
%GUI部分开始
fig = figure('units','normalized','position',[0.1 0.1 0.6 0.8],...
'menubar','none','numberTitle','off','Name','烟花欣赏','WindowButtonDownFcn',@yanhua...
);
%菜单
file_menu = uimenu(fig,'Label','文件(&f)');
sub_file_menu1 = uimenu(file_menu,'Label','退出(&q)','CallBack',@file_menu_callback);
style_menu = uimenu(fig,'Label','爆炸风格(&s)');
sub_style_menu1 = uimenu(style_menu,'Label','风格(&1)','CallBack',@style_menu_callback);
sub_style_menu2 = uimenu(style_menu,'Label','风格(&2)','CallBack',@style_menu_callback);
sub_style_menu3 = uimenu(style_menu,'Label','风格(&3)','CallBack',@style_menu_callback);
sub_style_menu4 = uimenu(style_menu,'Label','风格(&4)','CallBack',@style_menu_callback);
sub_style_menu5 = uimenu(style_menu,'Label','风格(&5)','CallBack',@style_menu_callback);
sub_style_menu6 = uimenu(style_menu,'Label','风格(&6)','CallBack',@style_menu_callback);
picture_menu = uimenu(fig,'Label','背景图片(&p)');
sub_picture_menu1 = uimenu(picture_menu,'Label','图片(&1)','CallBack',@picture_menu_callback);
sub_picture_menu2 = uimenu(picture_menu,'Label','图片(&2)','CallBack',@picture_menu_callback);
sub_picture_menu3 = uimenu(picture_menu,'Label','图片(&3)','CallBack',@picture_menu_callback);
sub_picture_menu4 = uimenu(picture_menu,'Label','图片(&4)','CallBack',@picture_menu_callback);
sub_picture_menu5 = uimenu(picture_menu,'Label','图片(&5)','CallBack',@picture_menu_callback);
color_menu = uimenu(fig,'Label','烟花颜色(&c)');
sub_color_menu1 = uimenu(color_menu,'Label','黄色(&1)','CallBack',@color_menu_callback);
sub_color_menu2 = uimenu(color_menu,'Label','紫红色(&2)','CallBack',@color_menu_callback);
sub_color_menu3 = uimenu(color_menu,'Label','青色(&3)','CallBack',@color_menu_callback);
sub_color_menu4 = uimenu(color_menu,'Label','红色(&4)','CallBack',@color_menu_callback);
sub_color_menu5 = uimenu(color_menu,'Label','绿色(&5)','CallBack',@color_menu_callback);
sub_color_menu6 = uimenu(color_menu,'Label','蓝色(&6)','CallBack',@color_menu_callback);
sub_color_menu7 = uimenu(color_menu,'Label','白色(&7)','CallBack',@color_menu_callback);
sub_color_menu8 = uimenu(color_menu,'Label','五彩变换(&8)','CallBack',@color_menu_callback);
%按钮面板
color_button_group = uibuttongroup(fig,'Title','颜色调节面板','Position',[0.83,0.55,0.16,0.44]);
speed_button_group = uibuttongroup(fig,'Title',regexprep('速度调节面板(num)','num',num2str(v0)),'Position',[0.83,0.36,0.16,0.185],'Tag','speed_panel');
number_button_group = uibuttongroup(fig,'Title',regexprep('数量调节面板(num)','num',num2str(n)),'Position',[0.83,0.005,0.16,0.35],'Tag','ammount_panel');
%颜色微调滑动条
red_slider = uicontrol(fig,'Styl