极坐标三维插值问题
介绍
插值是在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。
Matlab中有interp1
,interp2
函数通过给定一维或二维的点来插值。插值方法有近邻、线性、三次样条、多项式等等。
极坐标插值
”三种笛卡尔坐标到极坐标转换插值算法比较“这篇博客说了极坐标插值的方法,没实现
转换成平面坐标 采用三角形插值
参考了该提问How to interpolate using in polar coordinate,最后的方法
- 首先将源数据集(Theta, R, T)转换为(X, Y, Z)格式
- 对源数据(X, Y)进行三角形划分
- 给定需要插值的数据点P(xi, yi)
- 通过三角形插值方法,确定P点的值为zi
我们常用的是矩形的四个点来确定插值数据,比如水蒸气热力学数据的插值,通过温度和压力两个确定状态参数,通过两次线性的插值确定。
三角形的插值方法,是通过三个点确定三角形内部点的数据。参考这篇介绍https://spatialanalysisonline.com/HTML/triangulation_with_linear_inte.htm
The standard form of interpolation using triangulation of the data points is a widely available exact method. The Delaunay triangulation of the point set is first computed with the z-values of the vertices determining the tilt of the triangles. Interpolation is then simply a matter of identifying the value at each grid node by linearly interpolating within the relevant triangle.
使用数据点三角剖分的标准插值形式是一种广泛可用的精确方法。 点集的 Delaunay 三角剖分首先使用确定三角形倾斜度的顶点的 z 值进行计算。 插值只是通过在相关三角形内线性插值来识别每个网格节点处的值的问题。
代码
clc;clear;
%
%导入原始数据 比如data数据三列 分别是theta r T
%
% data polar coord数据 // R theta Temp
T = data(:,3);
[X,Y] = pol2cart(data(:,2),data(:,1));
figure(1)
subplot(2,2,1);
plot(X,Y,‘*‘);
axis equal;
title(‘采样点分布‘);
subplot(2,2,2)
tri = delaunayTriangulation(X, Y);
triplot(tri)
title(‘三角分块‘)
axis equal;
subplot(2,2,3)
plot3(X,Y,T,‘ro‘);
title(‘采样点T值‘)
% 插值点设置 极坐标的点 转换一下
thetap = 0:pi/180:2*pi;
rp= 0:0.1:4.8;
[Thetap,Rp] = meshgrid(thetap,rp);
[Xp,Yp] = pol2cart(Thetap,Rp);% 需要插值的点
Tp = zeros(length(rp),length(thetap));
% 三角形插值方法
for i=1:length(rp)
for j=1:length(thetap)
xi = Xp(i,j);yi = Yp(i,j);
idx = pointLocation(tri, xi, yi);
if(~isnan(idx))
pts= tri(idx,:);
m=[X(pts) Y(pts) Temp(pts) ones(3,1)];
Tp(i,j)= (-xi*det(m(:,2:end)) + yi*det([m(:,1) m(:,3:end)]) + det(m(:,1:end-1)))/det([m(:,1:2) m(:,end)]);
end
end
end
subplot(2,2,4)
contourf(Xp,Yp,Tp);
colorbar
title(‘插值后画图‘)
axis equal;
后续
当然也可以用四点梯形插值,只需确定插值点周围的四个点数据,通过插值算法确定被插数据。