使用MATLAB做一个滚动的文字球,文字内容来源于小说《长安十二时辰》片段,至于为什么节选《长安十二时辰》,当然是因为他最近火啊。有兴趣也可以做滚动文字球之百家姓、之千字文、之万物等。废话少说,代码如下:
function changan
%% 球的方程
t1 = linspace(0,2*pi,20);
t2 = linspace(-pi/2,pi/2,20);
[Theta, Pho] = meshgrid(t1,t2);
x = cos(Pho).*cos(Theta);
y = cos(Pho).*sin(Theta);
z = sin(Pho);
%% 读文本及处理
fid=fopen('长安十二时辰.txt','r');
data_changan=fscanf(fid,'%s');
fclose(fid);
expression={',','。',';','?','“','”','、'};
replace={''};
data_new=regexprep(data_changan,expression,replace);%正则表达式
str=data_new(1:400);
%%
ColorMat = jet(200);
id = randi(200,1,400);
surf([x,x(:,1)]/8,[y,y(:,1)]/8,[z,z(:,1)]/8,'FaceColor','r','EdgeColor','None');
camlight;
hold on;
arrayfun(@(i)text(x(i),y(i),z(i),str(i),'Color',ColorMat(id(i),:)),1:400);
axis([-1.1,1.1,-1.1,1.1,-1.1,1.1]);
axis vis3d off;
set(gcf,'WindowButtonMotionFcn',@MyWindowButtonMotionFcn);
hold off;
function MyWindowButtonMotionFcn(hobj, eve)
cp = get(gca,'CurrentPoint');
view(cp(1,:));
end
end
效果如下:
文字球随着鼠标的滚动而滚动。
简单说明:第一部分为球的方程;第二部分读取文本《长安十二时辰.txt》,并使用正则表达式regexprep把其中的标点符号删掉只保留汉字;第三部分使用arrayfun把读取到的文字放到球上,并且设置文字为不同的颜色使文字球好看一点;第四部分设置figure的WindowButtonMotionFcn,当鼠标移动时,执行相应的CallBack函数,响应函数通过获取坐标轴的坐标点CurrentPoint,通过设置图形的当前视点来实现文字球的滚动。