利用Matlab繪制一個可愛的南瓜燈
效果及原理
效果如下:
調一下數據還能改成三角眼:
原理
南瓜主體函數從知友 [九章算法] 的一張圖而來,大體是瓜身瓜柄分段函數,然後繞著z軸旋轉一周得到曲面,我對數值做瞭微調,原圖及原始數據:
實現方法
這裡我故意保留瞭網格讓南瓜看起來有一點佈娃娃的感覺,(大傢也可以根據自己喜好改寫,例如將’EdgeColor’設置為’none’並打個光啥的)
% 構造網格 [t,p]=meshgrid(linspace(0,2*pi,200),linspace(0,pi-.05,200)); % 二元分段函數 foutline=@(t,p)(p<=.14).*90.*cos(7.*p)+(p>.14).*(cos(20.*t)+70).*(p.*(pi-p+.1)).^.2; % 球面坐標轉化為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; % 顏色矩陣構造 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)
眼睛嘴巴部分:
這部分我就將一部分曲面上的點設置為nan,繪制出來的圖像相對應地方就是空缺:
% 畫個嘴巴 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; % 球面坐標轉化為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;
發光:
為瞭模擬發光,我在南瓜內部繪制瞭一個小一圈的南瓜並設置為燈光的顏色:
% 繪制一個小一圈的南瓜頭假裝光源 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; % 構造網格 [t,p]=meshgrid(linspace(0,2*pi,200),linspace(0,pi-.05,200)); % 二元分段函數 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)); % 畫個嘴巴 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; % 球面坐標轉化為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; % 顏色矩陣構造 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]; % 繪制一個小一圈的南瓜頭假裝光源 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繪制一個可愛的南瓜燈的詳細內容,更多關於Matlab繪制南瓜燈的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Matlab實現四種HSV色輪圖繪制的示例代碼
- JavaScript仿京東放大鏡特效
- js模擬實現京東詳情頁圖片放大效果
- 用javascript實現放大鏡效果
- Javascript實例項目放大鏡特效的實現流程