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版)的主要内容,如果未能解决你的问题,请参考以下文章