MATLAB制作炫酷动图
前言
之前看到好多网站有那种炫酷的动图,就希望自己用代码实现一下。参考网页:http://rscup.eyecool.cn/。
是不是特别炫酷?
问题分析
动图的每一帧都是由点和线构成。首先分析点。可以看到,每个点的位置都在变化,匀速向某个方向运动,最后消失在边界。每个点的运动方向是随机的。
两点之间连线。线的亮度随与这两点之间距离有关:距离越大,则线越暗。当距离大于某一阈值,则不再连线。
代码实现
% desktop_play.m
%=========================================================================
% by Qian Song Nov. 28 2018
%=========================================================================
num = 30;
max_value = 500;
p = randi(300,num,2)+100;
max_dis = sqrt(max_value^2*2);
dis_mat = zeros(num,num);
fg = figure;
for m = 1:20
delta = randi(3,num,2).*randsrc(num,2);
for i = 1:50
p = p + delta;
p(p<1) = 1;
p(p>max_value) = max_value;
for k = 1:num
dis_mat(k,:) = sqrt((p(k,1) - p(:,1)).^2 + (p(k,2) - p(:,2)).^2);
end
dis_mat = dis_mat./max(dis_mat(:));
clf
patch([0 max_value max_value 0], [0 0 max_value max_value], [0 0 0])
for k = 1:num
for j = k+1:num
hold on
if(dis_mat(k,j)<0.25)
plot(p([k,j],1),p([k,j],2),'-o','Color',[1 1 1].*(1-dis_mat(k,j).*4));
end
end
end
axis([1 max_value 1 max_value])
pause(0.1)
end
end
效果展示
添加反射机制
当点运动到边界时,添加反射:
delta(p<1 | p>max_value) = -delta(p<1 | p>max_value);
所有代码如下:
% desktop_play.m
%=========================================================================
% by Qian Song Nov. 28 2018
%=========================================================================
num = 50;
max_value = 500;
p = randi(300,num,2)+100;
max_dis = sqrt(max_value^2*2);
dis_mat = zeros(num,num);
fg = figure;
for m = 1:20
delta = randi(3,num,2).*randsrc(num,2);
for i = 1:50
p = p + delta;
delta(p<1 | p>max_value) = -delta(p<1 | p>max_value);
p(p<1) = 1;
p(p>max_value) = max_value;
for k = 1:num
dis_mat(k,:) = sqrt((p(k,1) - p(:,1)).^2 + (p(k,2) - p(:,2)).^2);
end
dis_mat = dis_mat./max(dis_mat(:));
clf
patch([0 max_value max_value 0], [0 0 max_value max_value], [0 0 0])
for k = 1:num
for j = k+1:num
hold on
if(dis_mat(k,j)<0.2)
plot(p([k,j],1),p([k,j],2),'-o','Color',[1 1 1].*(1-dis_mat(k,j).*5));
end
end
end
axis([1 max_value 1 max_value])
pause(0.001)
end
end