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

猜你喜欢

转载自blog.csdn.net/cherry593/article/details/84615416