MATLAB版本万圣节南瓜灯二创(方便diy版)

Posted slandarer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB版本万圣节南瓜灯二创(方便diy版)相关的知识,希望对你有一定的参考价值。

为了方便大家对南瓜灯进行不同表情绘制,这里搞了个更方便diy的版本

使用方式就是先点击figure2(黑白图的那个窗口),上下左右键移动红叉,空格键绘制黑点或白点(将南瓜雕刻或修补),南瓜的曲面会同步调整,数据也会被同步存到mask.mat,下次打开还是你创作的样子。

若是想恢复基础版本,只需要删除mask.mat文件即可。
以下是完整代码:

function pumpkinSL
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;

if ~exist('mask.mat')
    save mask.mat mask;
else
    mask=load('mask.mat');
    mask=mask.mask;
end

% 球面坐标转化为X,Y,Z
h=cos(p).*foutline(t,p);
Ro=sin(p).*foutline(t,p);
R=Ro.*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

fig1=figure();
ax1=gca;
ppkHdl=surf(ax1,X,Y,h,'CData',CMap,'EdgeColor',[0,0,0],'EdgeAlpha',.2);
hold(ax1,'on')
ax1.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(ax1,X,Y,h,'FaceColor',[248,240,186]./255,'EdgeColor','none')
ax1.View=[-137.3000 13.9844];

fig2=figure();
ax2=gca;
hold(ax2,'on')
axis equal
ax2.XLim=[0,201];
ax2.YLim=[0 201];
ax2.YDir='reverse';
[x,y]=find(isnan(mask));
surfHdl=scatter(ax2,y,x,5,'s','filled','CData',[0 0 0]);
position=[100,100];
posHdl=scatter(ax2,position(1,1),position(1,2),150,'rx');



set(fig2,'KeyPressFcn', @key)
    function key(~,event)
        switch event.Key
            case 'uparrow'
                position=position+[0,-1];
            case 'downarrow'
                position=position+[0,1];
            case 'leftarrow'
                position=position+[-1,0];
            case 'rightarrow'
                position=position+[1,0];   
            case 'c'
                position=[0,0];
            case 'space'
                if isnan(mask(position(1,2),position(1,1)))
                    mask(position(1,2),position(1,1))=1;
                else
                    mask(position(1,2),position(1,1))=nan;
                end
                [x,y]=find(isnan(mask));
                surfHdl.XData=y;
                surfHdl.YData=x;
                R=Ro.*mask;
                X=cos(t).*R;
                Y=sin(t).*R;
                ppkHdl.XData=X;
                ppkHdl.YData=Y;
                save mask.mat mask;
        end
        position(position<1)=1;
        position(position>200)=200;
        posHdl.XData=position(1,1);
        posHdl.YData=position(1,2);
    end


end

以上是关于MATLAB版本万圣节南瓜灯二创(方便diy版)的主要内容,如果未能解决你的问题,请参考以下文章

程序员技术宅万圣节自制“南瓜俄罗斯方块”

万圣节快到了,一起用MATLAB绘制一个可爱的南瓜灯叭

万圣节快到了,一起用MATLAB绘制一个可爱的南瓜灯叭

《天堂2:血盟》万圣节惊悚爆料!向南瓜重“锤”出击

uoj#142UER #5万圣节的南瓜灯 乱搞+并查集

万圣节奇妙夜,不给糖就捣蛋—Python带你点击解锁恐怖新道具(南瓜头骷髅蝙蝠糖......)