问题来源:某讨论群某同学的提问,想做出一个带有箭头电场的流线图。
绘制流线,Matlab提供了streamline函数,由于我也是第一次遇到这个问题,于是乎打开streamline的帮助文档,然后仔细查看一番,心里便有了思路,开始动手实践,下面就以这个函数的官方帮助文档里的demo来演示,如何实现在流线上绘制箭头。
clear; clc;
% 直接把streamline函数的帮助文档demo拷贝过来
[x,y] = meshgrid(0:0.1:1, 0:0.1:1);
u = x;
v = -y;
startx = 0.1:0.1:0.9;
starty = ones(size(startx));
% 需要获取所有流线的属性
lines = streamline(x, y, u, v, startx, starty);
% 下面开始画箭头,涉及到坐标的转换
% 获取 Axes 位置
posAxes = get(gca, 'Position');
posX = posAxes(1);
posY = posAxes(2);
width = posAxes(3);
height = posAxes(4);
% 获取 Axes 范围
limX = get(gca, 'Xlim');
limY = get(gca, 'Ylim');
minX = limX(1);
maxX = limX(2);
minY = limY(1);
maxY = limY(2);
% 遍历,逐条流线加箭头
for i = 1 : length(lines)
% 获取每条流线的数据
xData = lines(i).XData;
yData = lines(i).YData;
% 这里取的是最后两个点,一定要是相邻的两个点用来确定箭头方向
x0 = xData(end-1 : end);
y0 = yData(end-1 : end);
% 转换坐标到相对于figure的坐标
xNew = posX + (x0 - minX) / (maxX - minX) * width;
yNew = posY + (y0 - minY) / (maxY - minY) * height;
% 画箭头
hold on
annotation('arrow', xNew, yNew, 'color', 'b');
end
hold off
title('带箭头的流线图');
看看效果图:
【秘籍】
- 获取流线的坐标数据,如何获取,查看帮助文档得知,绘制时赋值即可获取到所有绘制对象的属性,然后逐条流线获取数据即可;
- 绘制箭头,这个方法前面也有文章提到过(【Matlab学习秘籍】绘制带箭头直线),这里把主要过程也重复了一遍;
- 关于箭头的两个坐标,选取两个相邻的点,方便确定箭头的方向。