C语言
主页 > 软件编程 > C语言 >

利用Matlab绘制一个可爱的南瓜灯

2022-02-26 | 秩名 | 点击:

效果及原理

效果如下:

调一下数据还能改成三角眼:

原理

南瓜主体函数从知友 [九章算法] 的一张图而来,大体是瓜身瓜柄分段函数,然后绕着z轴旋转一周得到曲面,我对数值做了微调,原图及原始数据:

实现方法

这里我故意保留了网格让南瓜看起来有一点布娃娃的感觉,(大家也可以根据自己喜好改写,例如将’EdgeColor’设置为’none’并打个光啥的)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

% 构造网格

[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,绘制出来的图像相对应地方就是空缺:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

% 画个嘴巴

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;

发光:

为了模拟发光,我在南瓜内部绘制了一个小一圈的南瓜并设置为灯光的颜色:

1

2

3

4

5

6

% 绘制一个小一圈的南瓜头假装光源

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')

完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

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

原文链接:https://blog.csdn.net/slandarer/article/details/120857708
相关文章
最新更新