利用Matlab繪制一個(gè)可愛的南瓜燈
效果及原理
效果如下:

調(diào)一下數(shù)據(jù)還能改成三角眼:

原理
南瓜主體函數(shù)從知友 [九章算法] 的一張圖而來,大體是瓜身瓜柄分段函數(shù),然后繞著z軸旋轉(zhuǎn)一周得到曲面,我對(duì)數(shù)值做了微調(diào),原圖及原始數(shù)據(jù):

實(shí)現(xiàn)方法
這里我故意保留了網(wǎng)格讓南瓜看起來有一點(diǎn)布娃娃的感覺,(大家也可以根據(jù)自己喜好改寫,例如將’EdgeColor’設(shè)置為’none’并打個(gè)光啥的)
% 構(gòu)造網(wǎng)格
[t,p]=meshgrid(linspace(0,2*pi,200),linspace(0,pi-.05,200));
% 二元分段函數(shù)
foutline=@(t,p)(p<=.14).*90.*cos(7.*p)+(p>.14).*(cos(20.*t)+70).*(p.*(pi-p+.1)).^.2;
% 球面坐標(biāo)轉(zhuǎn)化為X,Y,Z
h=cos(p).*foutline(t,p);
R=sin(p).*foutline(t,p);
R=R;
X=cos(t).*R;
Y=sin(t).*R;
% 顏色矩陣構(gòu)造
CMap=ones([size(t),3]);
tMap=ones(size(t));
c1=[253,158,3]./255;
c2=[76,103,86]./255;
for i=1:3
tMap(:,:)=c1(i);
tMap(p<=.14)=c2(i);
CMap(:,:,i)=tMap;
end
figure()
surf(X,Y,h,'CData',CMap,'EdgeColor',[0,0,0],'EdgeAlpha',.2)


眼睛嘴巴部分:
這部分我就將一部分曲面上的點(diǎn)設(shè)置為nan,繪制出來的圖像相對(duì)應(yīng)地方就是空缺:
% 畫個(gè)嘴巴 mask(maskX>50&maskX<100&maskY>130&maskY<140)=nan; % 矩形眼睛 mask(maskX>45&maskX<65&maskY>90&maskY<100)=nan; mask(maskX>85&maskX<105&maskY>90&maskY<100)=nan; % 三角形眼睛 % mask(maskX>45&maskX<70&maskY>90&maskY<100)=nan; % mask(maskX>80&maskX<105&maskY>90&maskY<100)=nan; % mask(maskX>45&maskX<70&maskY>90&maskY<100&(maskX-maskY>-35))=1; % mask(maskX>45&maskX<70&maskY>90&maskY<100&(maskX-maskY(end:-1:1,:)<-55))=1; % mask(maskX>80&maskX<105&maskY>90&maskY<100&(maskX-maskY>5))=1; % mask(maskX>80&maskX<105&maskY>90&maskY<100&(maskX-maskY(end:-1:1,:)<-15))=1; % 球面坐標(biāo)轉(zhuǎn)化為X,Y,Z h=cos(p).*foutline(t,p); R=sin(p).*foutline(t,p); R=R.*mask; X=cos(t).*R; Y=sin(t).*R;

發(fā)光:
為了模擬發(fā)光,我在南瓜內(nèi)部繪制了一個(gè)小一圈的南瓜并設(shè)置為燈光的顏色:
% 繪制一個(gè)小一圈的南瓜頭假裝光源 h=cos(p).*foutline(t,p).*0.95; R=sin(p).*foutline(t,p).*0.95; X=cos(t).*R; Y=sin(t).*R; surf(X,Y,h,'FaceColor',[248,240,186]./255,'EdgeColor','none')

完整代碼
function pumpkin
clc;clear;
% 構(gòu)造網(wǎng)格
[t,p]=meshgrid(linspace(0,2*pi,200),linspace(0,pi-.05,200));
% 二元分段函數(shù)
foutline=@(t,p)(p<=.14).*90.*cos(7.*p)+(p>.14).*(cos(20.*t)+70).*(p.*(pi-p+.1)).^.2;
mask=ones(size(t));
[maskX,maskY]=meshgrid(1:size(t,1),1:size(t,2));
% 畫個(gè)嘴巴
mask(maskX>50&maskX<100&maskY>130&maskY<140)=nan;
% 矩形眼睛
mask(maskX>45&maskX<65&maskY>90&maskY<100)=nan;
mask(maskX>85&maskX<105&maskY>90&maskY<100)=nan;
% 三角形眼睛
% mask(maskX>45&maskX<70&maskY>90&maskY<100)=nan;
% mask(maskX>80&maskX<105&maskY>90&maskY<100)=nan;
% mask(maskX>45&maskX<70&maskY>90&maskY<100&(maskX-maskY>-35))=1;
% mask(maskX>45&maskX<70&maskY>90&maskY<100&(maskX-maskY(end:-1:1,:)<-55))=1;
% mask(maskX>80&maskX<105&maskY>90&maskY<100&(maskX-maskY>5))=1;
% mask(maskX>80&maskX<105&maskY>90&maskY<100&(maskX-maskY(end:-1:1,:)<-15))=1;
% 球面坐標(biāo)轉(zhuǎn)化為X,Y,Z
h=cos(p).*foutline(t,p);
R=sin(p).*foutline(t,p);
R=R.*mask;
X=cos(t).*R;
Y=sin(t).*R;
% 顏色矩陣構(gòu)造
CMap=ones([size(t),3]);
tMap=ones(size(t));
c1=[253,158,3]./255;
c2=[76,103,86]./255;
for i=1:3
tMap(:,:)=c1(i);
tMap(p<=.14)=c2(i);
CMap(:,:,i)=tMap;
end
figure()
surf(X,Y,h,'CData',CMap,'EdgeColor',[0,0,0],'EdgeAlpha',.2)
ax=gca;
hold(ax,'on')
% ax.Color=[0 0 0];
% 繪制一個(gè)小一圈的南瓜頭假裝光源
h=cos(p).*foutline(t,p).*0.95;
R=sin(p).*foutline(t,p).*0.95;
X=cos(t).*R;
Y=sin(t).*R;
surf(X,Y,h,'FaceColor',[248,240,186]./255,'EdgeColor','none')
ax.View=[-137.3000 13.9844];
end

以上就是利用Matlab繪制一個(gè)可愛的南瓜燈的詳細(xì)內(nèi)容,更多關(guān)于Matlab繪制南瓜燈的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++定義和初始化string對(duì)象實(shí)例詳解
這篇文章主要為大家介紹了C++定義和初始化string對(duì)象實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
C語言實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
C語言實(shí)現(xiàn)簡(jiǎn)單的文本編輯器
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單的文本編輯器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
Reactor反應(yīng)器的實(shí)現(xiàn)方法詳解
本篇文章是對(duì)Reactor反應(yīng)器的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

