利用Matlab制作一款刮刮乐抽奖特效

 更新时间:2022年03月01日 10:34:28   作者:slandarer  
七夕节还不知道送啥,教你用MATLAB制作一款刮刮乐抽奖特效,让她的手气决定她的礼物。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

1.效果展示

程序运行效果如下:

如图所示,按住鼠标不松开并滑动鼠标,即可刮开图层:

2.程序原理说明

2.1 奖项设置

奖项设置写在一个cell元胞数组中,第一列为文本信息,第二列为抽到的概率:

strSet={'520元红包一个',15/100;
        '1314元红包一个',5/100;
        '黑丝水手服',20/100;
        '黑丝女仆装',20/100;
        '抱抱×50次',20/100;
        '亲亲×50次',20/100;}; 
probVal=cell2mat(strSet(:,2)); %提取第二列概率信息

2.2 随机抽取

我们首先将离散型概率密度函数转换为概率分布函数:

% 将概率密度函数转换为概率分布函数
for i=2:length(probVal)
    probVal(i)=probVal(i)+probVal(i-1);
end

例如

概率密度和概率分布如下:

概率密度概率分布
0.150.15
0.050.2
0.20.4
0.20.6
0.20.8
0.21

则若是我抽到的随机数为0.7,0.7在概率分布第四个数和第五个数之间,我们就认为我们抽到的是第五个选项。该部分代码如下:

randNum=rand();
numRange=probVal>randNum;
strPos=find(numRange,1);

确定了是第几个奖项就可以显示字符串了,用text函数在坐标区域进行显示:

text(300,100,strSet{strPos,1},...
    'HorizontalAlignment','center','FontSize',60)

2.3绘制图层

使用image绘制一张颜色为灰色每个位置透明度都为1的图片:

coverageMat_C=ones(200,600,3).*0.62;
coverageMat_A=ones(200,600);

coverageHdl=image([0 600],[0 200],coverageMat_C,...
                  'AlphaData',coverageMat_A);

2.4 滑动鼠标刮奖

判断鼠标是否被点击

假设我们当前figure名为fig,以下设置是在fig的基础上设置,首先我们要判定鼠标是否被按住。因此我们设置一个名为isClicking,并设置鼠标按下和鼠标松开两个回调函数,当鼠标点击时将isClicking设置为true,当鼠标松开时isClicking设置为false。

isClicking=false;
set(fig,'WindowButtonDownFcn',@bt_down);
function bt_down(~,~),isClicking=true;end

set(fig,'WindowButtonUpFcn',@bt_up);
function bt_up(~,~),isClicking=false;end

鼠标滑动刮奖

该部分代码:

[xMesh,yMesh]=meshgrid(1:600,1:200);

set(fig,'WindowButtonMotionFcn',@bt_move);
function bt_move(~,~)
    if isClicking
        mousePos=fig.CurrentPoint;
        boolPos=sqrt((xMesh-mousePos(1)).^2+(yMesh-mousePos(2)).^2)<=15;
        coverageMat_A(boolPos)=0;
        set(coverageHdl,'AlphaData',coverageMat_A)
    end
end

3.完整代码

function scratchCard
strSet={'520元红包一个',15/100;
        '1314元红包一个',5/100;
        '黑丝水手服',20/100;
        '黑丝女仆装',20/100;
        '抱抱×50次',20/100;
        '亲亲×50次',20/100;}; 
probVal=cell2mat(strSet(:,2));
% 将概率密度函数转换为概率分布函数
for i=2:length(probVal)
    probVal(i)=probVal(i)+probVal(i-1);
end


fig=figure('units','pixels');
fig.Position=[300 80 600 200];
fig.NumberTitle='off';
fig.MenuBar='none';
fig.Resize='off';
fig.Name='刮刮乐';

ax=axes(fig);
ax.Position=[0 0 1 1];
ax.XTick=[];
ax.YTick=[];
ax.ZTick=[];
ax.XLim=[0 600];
ax.YLim=[0 200];
hold(ax,'on')


randNum=rand();
numRange=probVal>randNum;
strPos=find(numRange,1);
text(300,100,strSet{strPos,1},...
    'HorizontalAlignment','center','FontSize',60)

coverageMat_C=ones(200,600,3).*0.62;
coverageMat_A=ones(200,600);
[xMesh,yMesh]=meshgrid(1:600,1:200);

coverageHdl=image([0 600],[0 200],coverageMat_C,...
                  'AlphaData',coverageMat_A);

isClicking=false;
set(fig,'WindowButtonDownFcn',@bt_down);
function bt_down(~,~),isClicking=true;end

set(fig,'WindowButtonUpFcn',@bt_up);
function bt_up(~,~),isClicking=false;end
             
set(fig,'WindowButtonMotionFcn',@bt_move);
function bt_move(~,~)
    if isClicking
        mousePos=fig.CurrentPoint;
        boolPos=sqrt((xMesh-mousePos(1)).^2+(yMesh-mousePos(2)).^2)<=15;
        coverageMat_A(boolPos)=0;
        set(coverageHdl,'AlphaData',coverageMat_A)
    end
end


end

到此这篇关于利用Matlab制作一款刮刮乐抽奖特效的文章就介绍到这了,更多相关Matlab刮刮乐抽奖特效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VScode platformio使用的详细步骤

    VScode platformio使用的详细步骤

    使用VSCode作为编辑器,同时借助PlatformIO插件,可以帮助开发者更加高效地进行嵌入式开发,本文主要介绍了VScode platformio使用的详细步骤,感兴趣的可以了解一下
    2023-10-10
  • Matlab实现黑洞优化算法的示例代码

    Matlab实现黑洞优化算法的示例代码

    根据黑洞现象原理首次提出BH 算法,它在传统PSO基础上引入了新的机制,有效地提高了收敛速度并防止了陷入局部极值的情况发生.本文将用Matlab实现这一算法,需要的可以参考一下
    2022-06-06
  • 10行C++代码实现高性能HTTP服务

    10行C++代码实现高性能HTTP服务

    这篇文章主要介绍了10行C++代码如何实现高性能HTTP服务,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-04-04
  • C++初阶之list的模拟实现过程详解

    C++初阶之list的模拟实现过程详解

    在C++中我们经常使用STL,那个在那些我们常用的数据结构vector,list的背后,又是如何实现的呢?这篇文章主要给大家介绍了关于C++初阶之list的模拟实现的相关资料,需要的朋友可以参考下
    2021-08-08
  • C语言二分法求解方程根的两种方法

    C语言二分法求解方程根的两种方法

    这篇文章主要为大家详细介绍了C语言二分法求解方程根的两种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含义说明

    C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含义说明

    这篇文章主要介绍了C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含义说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • C/C++中的atan和atan2函数实例用法

    C/C++中的atan和atan2函数实例用法

    在本篇文章里小编给大家分享的是一篇关于C/C++中的atan和atan2函数实例用法相关内容,有兴趣的朋友们可以学习下。
    2020-02-02
  • OpenCV绘制正多边形的方法

    OpenCV绘制正多边形的方法

    这篇文章主要为大家详细介绍了OpenCV绘制正多边形的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 一些C语言中字符串的算法问题解决实例小结

    一些C语言中字符串的算法问题解决实例小结

    这篇文章主要介绍了一些C语言中字符串的算法问题解决实例小结,包括将字符串转化为int类型的数及旋转字符串等操作,需要的朋友可以参考下
    2016-03-03
  • 深入理解C语言中编译相关的常见错误

    深入理解C语言中编译相关的常见错误

    本篇文章是对C语言中编译相关的常见错误进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论