前言
上一篇文章感觉对三角剖分问题没有说清楚,这次专门对三角剖分问题再仔细说说。
一、问题引入
实际上这个问题是用来解决二维曲面插值问题的。
二维插值问题,用matlab的一些函数就可以方便操作,比如 interp2 。但 interp2函数是用在规则点数据集的情况下,比如已知“密度较稀疏”的一些数据点,进行插值,找到“密度适中”的点。下面举个例子说明。
% 生成自定义的网格点
x = linspace(-3, 3, 10);
y = linspace(-3, 3, 15);
[X, Y] = meshgrid(x, y);
% 计算相应的高度值
Z = peaks(X, Y);
% 绘制原始网格图
figure;
subplot(1, 2, 1);
surf(X, Y, Z);
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Original Peaks Surface');
axis tight;
grid on;
% 指定插值后的网格点
xi = linspace(-3, 3, 30);
yi = linspace(-3, 3, 45);
[XI, YI] = meshgrid(xi, yi);
% 使用插值方法计算插值后的高度值
ZI = interp2(X, Y, Z, XI, YI, 'spline');
% 绘制插值后的网格图
subplot(1, 2, 2);
surf(XI, YI, ZI);
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Interpolated Peaks Surface');
axis tight;
grid on;
得到图如下:
但对于一些无序(或者说在空间排列没有规律)的散点进行插值,这时要使用 三角剖分插值
具体概念介绍可以参考下面的wiki链接
https://en.wikipedia.org/wiki/Delauna4_triangulation
二、一个例子
1.生成散点图
为了好说明,我们在1/4半球面上进行操作,随机选取球面上的一些点作为散点,同时画出它的xy面投影剖分(后面要用)
% 定义半径和绘制分辨率
radius = 1; % 半径
resolution = 50; % 分辨率
% 生成球面上的坐标点
theta = linspace(-pi/2, 0, reso