0%

莫比乌斯环的可视化

莫比乌斯环的参数方程: \[ \vec{f}:(t,\varphi)\mapsto \begin{bmatrix} \displaystyle\Big(1+\frac{t}{2}\cos\frac{\varphi}{2}\Big)\cos\varphi \\[8pt] \displaystyle\Big(1+\frac{t}{2}\cos\frac{\varphi}{2}\Big)\sin\varphi \\[8pt] \displaystyle\frac{t}{2}\sin\frac{\varphi}{2} \end{bmatrix} \]

其中,\(t\in[-1,1]\)\(\varphi\in[0,2\pi]\)

可视化效果如下:

代码如下:

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
63
64
65
66
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 绘制莫比乌斯环
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% INPUT
% num1 : - 标量, 线数
% num2 : - 标量, 环数
% k : - 标量, 设置环的颜色, 0=单色环, 1=彩色环
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% OUTPUT - NONE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 调用示例1 - 无输入, 随机初始化参数
% fig_mobius;
% 调用示例2 - 50条线, 15个彩色环
% fig_mobius(50,15,1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function fig_mobius(num1,num2,k)

if nargin==0
num1=randi([40,60]);num2=randi([10,20]);k=randi([0,1]);
end

% 取值范围: t=[-1,1], phi=[0,2*pi]
mobius=@(t,phi) [(1+t/2*cos(phi/2)).*cos(phi);
(1+t/2*cos(phi/2)).*sin(phi);
t/2*sin(phi/2)];

phin=linspace(0,2*pi,num1);
tn=linspace(-1,1,num2);

figure(1);hold on;
xlim([-1,1]*1.5);ylim([-1,1]*1.5);zlim([-1,1]*0.5);
view([52,67]);

switch k
case 0
for i=1:num2
temp=mobius(tn(i),phin);
plot3(temp(1,:),temp(2,:),temp(3,:),'color','blue');
pause(2/num2);
end
case 1
color_table=parula;% parula, jet, spring, summer
[numc1,~]=size(color_table);
xt=linspace(0,1,numc1);
numc2=ceil(num2/2);
xq=linspace(0,1,numc2);
tempc=interp1(xt,color_table,xq);
for i=1:numc2
temp1=mobius(tn(i),phin);
temp2=mobius(tn(num2-i+1),phin);
plot3(temp1(1,:),temp1(2,:),temp1(3,:),'color',tempc(i,:));
plot3(temp2(1,:),temp2(2,:),temp2(3,:),'color',tempc(i,:));
pause(2/numc2);
end
otherwise
error('INPUT k must be 0 or 1');
end

for i=1:num1
temp=mobius(tn,phin(i));
plot3(temp(1,:),temp(2,:),temp(3,:),'color',[0.65,0.65,0.65]);
pause(1.5/num1);
end

end