二维:quiver,并保存视频文件
%%
clc; clear; close all;
% 创建网格
[x, y] = meshgrid(-5:1:5, -5:1:5);
% 创建初始矢量场
u = -y;
v = x;
% 打开图形窗口并绘制初始矢量场
ax = gca;
grid on;
box off
hold on
ax.XLim = [-6, 6];
ax.YLim = [-6, 6];
ax.LineWidth = 1;
ax.XMinorTick = 'on';
ax.YMinorTick = 'on';
ax.GridLineStyle = ':';
ax.FontSize = 14;
ax.FontName = 'Times New Roman';
h = quiver(x, y, u, v,'Color', 'r','LineWidth',1.5);
title('Rotating Vector Field');
% 创建MP4视频对象
videoObj = VideoWriter('vector_field.mp4', 'MPEG-4');
open(videoObj);
% 捕获初始帧并初始化GIF
frame = getframe(gcf);
im = frame2im(frame);
[A, map] = rgb2ind(im, 256);
imwrite(A, map, 'vector_field.gif', 'LoopCount', inf, 'DelayTime', 0.1);
% 循环绘制旋转的矢量场
for theta = 0:pi/20:3*pi
% 旋转矩阵
R = [cos(theta), -sin(theta); sin(theta), cos(theta)];
uv = R * [u(:)'; v(:)'];
% 更新矢量场
h.UData = reshape(uv(1,:), size(u));
h.VData = reshape(uv(2,:), size(v));
drawnow;
% 捕获当前帧并追加到GIF
frame = getframe(gcf);
im = frame2im(frame);
A = rgb2ind(im, map);
imwrite(A, map, 'vector_field.gif', 'WriteMode', 'append', 'DelayTime', 0.1);
% 将帧写入MP4视频
writeVideo(videoObj, frame);
end
% 关闭MP4视频文件
close(videoObj);
二维动态矢量场
%% 绘制动态矢量场
clc; % 清除命令窗口
clear; % 清除工作空间中的所有变量
close all; % 关闭所有图形窗口
% 创建一个新的图形窗口
figure;
% 初始化gif
gifFileName = 'quiver3_animation.gif';
% 定义一个网格
[x, y, z] = meshgrid(-5:5, -5:5, -5:5);
% 定义一个用于循环的角度变量
angle = 0;
% 循环10次创建动态效果
for frame_num = 1:50
% 计算3D向量场的分量
u = sin(angle + x);
v = cos(angle + y);
w = sin(angle + z);
% 使用quiver3绘制3D箭头图
quiver3(x, y, z, u, v, w, 'LineWidth', 1, 'Color', 'blue');
xlim([-6, 6]); ylim([-6, 6]); zlim([-6, 6]); % 设置轴限制
view(3); % 设置3D视图
drawnow; % 立即更新图形窗口
% 从当前图形窗口捕获帧
frame = getframe;
% 捕获当前帧并保存为GIF
im = frame2im(frame);
[A,map] = rgb2ind(im,256);
if frame_num == 1
imwrite(A,map,gifFileName,'gif','LoopCount',Inf,'DelayTime',0.1);
else
imwrite(A,map,gifFileName,'gif','WriteMode','append','DelayTime',0.1);
end
% 更新角度变量,以便在下一帧中旋转向量场
angle = angle + pi/10;
clf; % 清除当前图形
end
close; % 关闭图形窗口
三维动态矢量场