一、三维散点图画图
有的时候我们要画一些三维图(曲面图),但图的方程没有,只有一些散点图,想要画这样的图mesh和surf是暂时不行的
他们要求输入的是矩阵,但我们获得是 x y z这样的一些散点的结合,这时候画图只能用plot3
比如我们这些数据和图:
不好意思,具体描述什么物理量暂时不清楚,据说是一个亚/超高斯曲面
现在有个需求,就是要从过 原点 和 过最大值(记为x0,y0,z0) 拉一个平面,对这个三维图进行切割,画出切割出出来的平面和曲面的交线,下面最大值,貌似在12 -90.5
二、Matlab中画透明平面
平面是有三个点决定的(不重叠的三个点),我这里有z轴和一个最大值点,也能确定一个平面(用来做剖面)
我们设定这个剖面的宽和高 分别为w和h
% 设界面高度为h,宽度为w,(根据具体情况定,按理说这个面是无穷大)
w = 300;
h = 120;
seta = atan2(y0,x0);%使用 atan2函数获得 剖面和xy平面投影交线与x轴的夹角
x1 = x0 - (w/2)* cos(seta);%分别获得这个交线的开始点
y1 = y0 - (w/2)* sin(seta);
x2 = x0 + (w/2)* cos(seta);%终止点
y2 = y0 + (w/2)* sin(seta);
% 剖截面
% 左下 x1,y1,0
% 右下 x2,y2,0
% 右上 x2,y2,h
% 左上 x1,y1,h
使用shape函数来画这个坡面,另外设定一定的透明度
patch([x1,x2,x2,x1],[y1,y2,y2,y1],[0,0,h,h],'w','FaceAlpha',0.4,'FaceColor','m');
有点样子了,可以适当调整 宽高比,达到16:9的黄金视觉
上面隐约能看到交叠线,但这是matlab画图造成的,并不是我们get到
所谓的get到是,数学上所谓的有某个解析解(方程)或者数值解(一系列数值点),现在没有,只是看到。
三、获得交线
交线实际上是要解方程的,原则上是,满足既在平面上,又在曲面上,然后联立成方程组,然后解方程得到若干个点,连成线。
但现在没方程,尤其是三维曲面,点都是散点,没方程,说不定还得等待拟合呢,所以行不通。
行不通也不能代表不能画,方法就是使用插值
插值的思路就是对 曲面进行二维插值,插值的网格点你选择在剖截面上就行了(满足平面方程)
首先我们有这个函数 TriScatteredInterp 这个函数后续可能不支持了
这个函数就是用散点进行插值,完了返回插值方程F ,你再使用 F对grid 上的待插值点求算即可
%插值函数
F = TriScatteredInterp(x,y,z,'linear');
N1 = 500;%保证数量,太少插值效果不好
dx = (Rxmax - Rxmin)/(N1-1);
grid_x = Rxmin:dx:Rxmax;
%网格上的xy点都符合剖截面方程
%构造这样的grid很重要,否则下面的 “解方程”没有根
%高能---->三维曲面只在固定的grid有数值,不是每个地方都能刚好交叉上<--- 高能
grid_y = (y0/x0).*(grid_x-x0)+ y0;
[x_interp,y_interp] = meshgrid(grid_x,grid_y);
z_interp = F(x_interp,y_interp);
得到z_interp就是空间曲线的z
我们把数据挑出来
intersecting_line=[];
for i = 1:N2
for j=1:N1
xp = x_interp(i,j);
yp = y_interp(i,j);
zp = z_interp(i,j);
if(abs(yp - ((y0/x0)*(xp-x0)+y0))==0) % 有的时候你并不能拿到刚好落在一起的点,那么你就要调整这个0阈值了
if (yp > Rymin)&&(yp < Rymax)
intersecting_line = [intersecting_line;[xp,yp,zp]] ;
end
end
end
end
% 拿出交线来
x_t = intersecting_line(:,1);
y_t = intersecting_line(:,2);
z_t = intersecting_line(:,3);
figure(1)
hold on
plot3(x_t,y_t,z_t,'r','linewidth',5);
(上图x轴坐标轴是相对值)
结果还不错
三、插值之后再使用mesh或者surf画图
现在插值结果也有了,我们可以使用mesh或者surf画图了
mesh(x_interp,y_interp,z_interp);
配合上面提到的 patch和plot3,立马得到最终的结果
总结一下:
画空间直线图 plot3
画曲面 mesh,surf
2D3D插值,TriScatteredInterp
有个疑问留给大家,上面二维插值的时候,能不能用interp2做插值?为什么?