利用Matlab制作一款刮刮樂抽獎(jiǎng)特效
1.效果展示
程序運(yùn)行效果如下:
如圖所示,按住鼠標(biāo)不松開并滑動(dòng)鼠標(biāo),即可刮開圖層:
2.程序原理說(shuō)明
2.1 獎(jiǎng)項(xiàng)設(shè)置
獎(jiǎng)項(xiàng)設(shè)置寫在一個(gè)cell元胞數(shù)組中,第一列為文本信息,第二列為抽到的概率:
strSet={'520元紅包一個(gè)',15/100; '1314元紅包一個(gè)',5/100; '黑絲水手服',20/100; '黑絲女仆裝',20/100; '抱抱×50次',20/100; '親親×50次',20/100;}; probVal=cell2mat(strSet(:,2)); %提取第二列概率信息
2.2 隨機(jī)抽取
我們首先將離散型概率密度函數(shù)轉(zhuǎn)換為概率分布函數(shù):
% 將概率密度函數(shù)轉(zhuǎn)換為概率分布函數(shù) for i=2:length(probVal) probVal(i)=probVal(i)+probVal(i-1); end
例如
概率密度和概率分布如下:
概率密度 | 概率分布 |
---|---|
0.15 | 0.15 |
0.05 | 0.2 |
0.2 | 0.4 |
0.2 | 0.6 |
0.2 | 0.8 |
0.2 | 1 |
則若是我抽到的隨機(jī)數(shù)為0.7,0.7在概率分布第四個(gè)數(shù)和第五個(gè)數(shù)之間,我們就認(rèn)為我們抽到的是第五個(gè)選項(xiàng)。該部分代碼如下:
randNum=rand(); numRange=probVal>randNum; strPos=find(numRange,1);
確定了是第幾個(gè)獎(jiǎng)項(xiàng)就可以顯示字符串了,用text函數(shù)在坐標(biāo)區(qū)域進(jìn)行顯示:
text(300,100,strSet{strPos,1},... 'HorizontalAlignment','center','FontSize',60)
2.3繪制圖層
使用image繪制一張顏色為灰色每個(gè)位置透明度都為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 滑動(dòng)鼠標(biāo)刮獎(jiǎng)
判斷鼠標(biāo)是否被點(diǎn)擊
假設(shè)我們當(dāng)前figure名為fig,以下設(shè)置是在fig的基礎(chǔ)上設(shè)置,首先我們要判定鼠標(biāo)是否被按住。因此我們?cè)O(shè)置一個(gè)名為isClicking,并設(shè)置鼠標(biāo)按下和鼠標(biāo)松開兩個(gè)回調(diào)函數(shù),當(dāng)鼠標(biāo)點(diǎn)擊時(shí)將isClicking設(shè)置為true,當(dāng)鼠標(biāo)松開時(shí)isClicking設(shè)置為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
鼠標(biāo)滑動(dòng)刮獎(jiǎng)
該部分代碼:
[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元紅包一個(gè)',15/100; '1314元紅包一個(gè)',5/100; '黑絲水手服',20/100; '黑絲女仆裝',20/100; '抱抱×50次',20/100; '親親×50次',20/100;}; probVal=cell2mat(strSet(:,2)); % 將概率密度函數(shù)轉(zhuǎn)換為概率分布函數(shù) 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
到此這篇關(guān)于利用Matlab制作一款刮刮樂抽獎(jiǎng)特效的文章就介紹到這了,更多相關(guān)Matlab刮刮樂抽獎(jiǎng)特效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何利用C++實(shí)現(xiàn)一個(gè)反射類
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)反射類,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-03-03wxWidgets實(shí)現(xiàn)無(wú)標(biāo)題欄窗口拖動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了wxWidgets實(shí)現(xiàn)無(wú)標(biāo)題欄窗口拖動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02OpenCV 視頻中火焰檢測(cè)識(shí)別實(shí)踐
本文主要介紹了OpenCV 視頻中火焰檢測(cè)識(shí)別,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(106.由中序和后序遍歷建立二叉樹),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07OpenGL實(shí)現(xiàn)不規(guī)則區(qū)域填充算法
這篇文章主要為大家詳細(xì)介紹了OpenGL實(shí)現(xiàn)不規(guī)則區(qū)域填充算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02C語(yǔ)言在輸入輸出時(shí)遇到的常見問題總結(jié)
大家在平時(shí)的做題中是否會(huì)遇到和我一樣的煩惱,題目的代碼已經(jīng)基本完成,但是在輸出時(shí)候,總是和題目給出的樣例輸出格式不同?,導(dǎo)致題目不能通過。為了解決這一煩惱,我總結(jié)了以下幾點(diǎn),需要的可以參考一下2022-09-09七夕表白! C語(yǔ)言實(shí)現(xiàn)愛情紅玫瑰
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)愛情紅玫瑰,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08