今天,看到网上的一个动态绘制的图形,就想用Matlab也画一个动态图。查看Matlab帮助文档,发现动态图的绘制主要有3种思路。私下揣测,写了一段简单的代码,画出数据点在3X3方格中的移动过程(也可以看做是超简单的寻路过程)。因为只是做演示用,所以获取数据点序列的代码非常简单,没有用到任何复杂算法。
代码主要功能是动态绘出星型点从1号方格移动到9个方格的过程,其中只有起始点和终点是确定的1和9,中间路径的点均是从邻接表中随机采样得到的。
%% Matlab Ex clc,clear,close all; % Adjacency table AdList = [1,2,4,nan,nan;... 2,1,3,5,nan;... 3,2,6,nan,nan;... 4,1,5,7,nan;... 5,2,4,6,8;... 6,3,5,9,nan;... 7,4,8,nan,nan;... 8,5,7,9,nan;... 9,6,8,nan,nan]; % Mapping table Mt = [1 1 1;... 2 2 1;... 3 3 1;... 4 1 2;... 5 2 2;... 6 3 2;... 7 1 3;... 8 2 3;... 9 3 3]; sta = 1; des = 9; temp = 1; traj = zeros(1,100); index = 1; traj(index) = sta; while temp ~= 9; temp = Search(temp, AdList); index = index + 1; traj(index) = temp; if index > 100 break; end end loca = find(traj > 0); traj = traj(loca); [road,len] = Map(traj, Mt); figure; axis equal; for i=1:len; plot(road(i,1), road(i,2), 'r*'); grid on; xlim([0.5 3.5]); ylim([0.5 3.5]); set(gca, 'XTickMode', 'manual', 'XTick', [0.5 1.5 2.5 3.5]); set(gca, 'YTickMode', 'manual', 'YTick', [0.5 1.5 2.5 3.5]); title(['The ' num2str(i) '/' num2str(len) ' step(s)']); pause(0.2); Fs(i) = getframe; end movie(Fs, 1, 2);
Search函数主要是从邻接表中找出下一个点的位置。这里只是随机找点,没有任何权重、成本方面的考虑。
function [des] = Search(sta, list) % search for the next point. % step by step [m, n] = size(list); flag = false; for i = 1:m; if sta == list(i,1) flag = true; break; end end if flag == false error('An error occurs in Search function.'); end v = list(i,:); des = v(randint(1,1,[2,n])); while isnan(des) r = randint(1,1,[2,n]); des = v(r); end end
Map函数主要是将编号值通过映射表 mt 映射成坐标值:
function [road, len] = Map(traj, mt) % mapping. % len = length(traj); road = zeros(len, 2); for i = 1:len; k = mt(:,1) == traj(i); road(i,:) = mt(k,2:3); end end
效果图如下: