Matlab三角剖分插值问题分析

news2024/12/23 1:59:17

目录

前言

一、问题引入

二、一个例子

1.生成散点图

2.对数据进行剖分

3.点法式分析

三、最后结果



前言

上一篇文章感觉对三角剖分问题没有说清楚,这次专门对三角剖分问题再仔细说说。


一、问题引入

实际上这个问题是用来解决二维曲面插值问题的。

二维插值问题,用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, resolution);
phi = linspace(0, pi/2, resolution);
[THETA, PHI] = meshgrid(theta, phi);
x = radius * sin(PHI) .* cos(THETA);
y = radius * sin(PHI) .* sin(THETA);
z = radius * cos(PHI);

% 随机选择50个点
numPoints = 50;
indices = randperm(resolution^2, numPoints);
selectedPoints = [x(indices(:)), y(indices(:)), z(indices(:))];

% 进行三角剖分
tri = delaunay(selectedPoints(:, 1), selectedPoints(:, 2));


% 绘制1/4半球面
figure;
surf(x, y, z);
hold on;

% 绘制随机选择的点
scatter3(selectedPoints(:, 1), selectedPoints(:, 2), selectedPoints(:, 3), 'filled', 'r');

 

2.对数据进行剖分

代码如下:


clear all
close all
clc
 rng(10)
% 定义半径和绘制分辨率
radius = 1;  % 半径
resolution = 50;  % 分辨率

% 生成球面上的坐标点
theta = linspace(-pi/2, 0, resolution);
phi = linspace(0, pi/2, resolution);
[THETA, PHI] = meshgrid(theta, phi);
x = radius * sin(PHI) .* cos(THETA);
y = radius * sin(PHI) .* sin(THETA);
z = radius * cos(PHI);

% 随机选择点
numPoints = 50;
indices = randperm(resolution^2, numPoints);
selectedPoints = [x(indices(:)), y(indices(:)), z(indices(:))];

save selectedPoints.mat selectedPoints

% 在xy平面上进行平面剖分
dt = delaunayTriangulation(selectedPoints(:, 1), selectedPoints(:, 2));
tri = dt.ConnectivityList;

% 根据剖分点的坐标和对应的z值生成三维空间中的三角网格
tri3D = [tri, tri(:, 1) + size(selectedPoints, 1), tri(:, 2) + size(selectedPoints, 1)];

x3D = [selectedPoints(:, 1); selectedPoints(:, 1); selectedPoints(:, 1)];
y3D = [selectedPoints(:, 2); selectedPoints(:, 2); selectedPoints(:, 2)];
z3D = [selectedPoints(:, 3); selectedPoints(:, 3); selectedPoints(:, 3)];

% 绘制1/4半球面
figure;
h = surf(x, y, z);
set(h, 'FaceAlpha', 0.5);  % 设置表面的透明度
% set(h, 'FaceColor', 'green');  % 设置表面颜色为空
hold on;

% 绘制随机选择的点
scatter3(selectedPoints(:, 1), selectedPoints(:, 2), selectedPoints(:, 3), 'filled', 'r');

triplot(dt);

% % 绘制三角网格
% trisurf(tri3D, x3D, y3D, z3D, 'FaceColor', 'none', 'EdgeColor', 'b', 'FaceAlpha', 0.5);

% 绘制三角网格
patch('Faces', tri3D, 'Vertices', [x3D, y3D, z3D], 'FaceColor', 'red', 'EdgeColor', 'b', 'FaceAlpha', 0.5);

% 设置坐标轴和标题
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Quarter Sphere with Random Points and Triangulation');

% 设置坐标轴比例和网格
axis equal;
grid on;




这个显示的有点复杂了,它是几个数据图像的结合 包括 原始数据(网格图)、散点图(红色)、空间和平面三角剖分图(蓝色)

我们去掉原始网格图,只留平面剖分和对应曲面的映射,看看如下

待插值的点会在这些红色三角面上找到对应的z值,因为散点插值可不同于interp2插值,根本没有"可以依赖"现成附近的方形网格点用来估算,需要借助剖分的找到它附近的点。好了,思路有了,流程化的东西如下:

三角剖分的流程

1、对空间散点的xy平面投影进行三角剖分(注意:并不是直接在空间曲面上进行三角剖分,而是对平面进行,因为使用delaunayTriangulation会对xyz三维数据直接给出的四面体立体剖分!即它会认为是立体剖分)

2、对待插值点的xy平面投影点,找到它属于xy平面剖分的哪个三角形(注意,是在xy平面)

3、在空间对对应三角形建立平面方程,然后使用点法式方式对待插值点求出z的值

平面和立体对应关系如下图(共同的xy,z当然不同了)

3.点法式分析

参考代码,还是沿用上一次提到的线性三角剖分的matlab代码

https://www.mathworks.com/matlabcentral/fileexchange/38925-linearly-interpolate-triangulation

 这代码核心的部分在这里:

其中点法式大家估计印象不是很深刻了,需要复习下空间解析几何的一点知识 ,两页ppt帮大家回疑

 

法向量怎么求呢,相当于在平面中两个矢量的叉乘!我们翻一下matlab cross的内容

比如两个矢量 V1 = [x2-x1,y2-y1,z2-z1],V2=[x3-x1,y3-y1,z3-z1],,记为 (a1,a2,a3)  (b1,b2,b3)

叉乘的结果是

A=a2*b3 - a3*b2=(y2-y1)*(z3-z1)-(z2-z1)*(y3-y1)

B = a3*b1-a1*b3=(z2-z1)*(x3-x1)-(x2-x1)*(z3-z1)

C = a1*b2-a2*b1 = (x2-x1)*(y3-y1)-(y2-y1)*(x3-x1) 

A*(xi-x1)+B*(yi-y1)+C*(zi-z1) = 0

zi =  (-((y3 - y1) * (z2 - z1) - (z3 - z1) * (y2 - y1)) * (x - x1) - ((z3 - z1) * (x2 - x1) - (x3 - x1) * (z2 - z1)) * (y - y1)) / ((x3 - x1) * (y2 - y1) - (y3 - y1) * (x2 - x1)) + z1

z1变到分子上去,然后分子变成 z1*XXX+z2*YYY+z3*CCC ,XXX,YYY,CCC就是代码中N1 N2 N3的分子

这样按照待插值的网格的点的顺序,依次计算即可得到全部的插值数据。


三、最后结果

简单对几个点进行插值,插值之后的空间点是黄色:


load selectedPoints.mat

%散点
x = selectedPoints(:,1);
y = selectedPoints(:,2);
z = selectedPoints(:,3);

% 定义插值点的网格
n_points = 5; % 插值点个数

xi = linspace(min(x), max(x), n_points); % x 坐标范围
yi = linspace(min(y), max(y), n_points); % y 坐标范围
[XI, YI] = meshgrid(xi, yi); % 插值点的网格

%x y z数据同前

% 构建三角剖分
DT = delaunayTriangulation(x, y);

% Get the connectivity table
tri = DT.ConnectivityList;
tri = tri(:, [1, 2, 3]);

ZI=interptri(tri,x,y,z,XI,YI);

%  绘制插值结果
figure(1)
hold on
% surf(XI, YI, ZI);

scatter3(XI(:), YI(:), ZI(:), 'filled', 'y');

xlabel('X');
ylabel('Y');
zlabel('Z');

很显然,原始插值点密集的话,插出来的曲面会更理想。

总结:空间曲面散点的三角剖分线性插值是一种常用的方法,用于从离散的散点数据中构建连续的曲面模型。该方法基于三角剖分技术,将散点分布的空间曲面划分为一系列三角形,然后利用线性插值来估计每个三角形内部的数据点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1246055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GWAS结果批量整理:升级版算法TidyGWAS

TidyGWAS GWAS分析关键结果之一是显著性SNP位点的P值,通常多年份多地点多模型的GWAS分析将会产生很多结果文件,如何对这些数据进行整理? 汇总这些结果,并将显著性的位点或区域找出来,更加清晰的展示关键信息。 今天介…

文旅虚拟人IP:数字时代的传统文化推荐官

近几年,随着文旅虚拟人频“上岗”,虚拟人逐渐成为了文旅品牌的一种新颖的传统文化传播思路。 文旅品牌定制化推出虚拟人,本质原因是2023旅游业全面复苏,各文旅玩法同质化现象严重,在这样的境遇下,文旅品牌开…

AIGC专题报告:生成式人工智能用例汇编

今天分享的是AIGC系列深度研究报告:《AIGC专题报告:生成式人工智能用例汇编》。 (报告出品方:德勤) 报告共计:16页 生成式人工智能(AI)的兴起 生成式AI给人类文明创造了无限的可…

【【Linux 常用命令学习 之 一 】】

Linux 常用命令学习 之 一 打开终端之后的 我们会了解 所使用的 字符串含义 其中前面的 zhuxushuai 是 当前的用户名字 接下来的 zhuxushuai-virtual-machine 是 机器名字 最后的符号 $表示 当前是普通用户 输入指令 ls 是打印出当前所在目录中所有文件和文件夹 shell 操…

python-冒泡排序

冒泡排序 (稳定) O(n^2) (稳定:表示相等的数,相对位置会不会改变) 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过多次遍历待排序的元素,比较相邻两个元素的大小并交换它们&…

周转箱与工具柜的智能化应用

在当今制造业激烈竞争的市场中,6S管理方法作为提高企业竞争力的有力工具,与精益生产中的周转箱和工具柜相结合,将为企业带来更大的优势。通过实施6S管理方法,企业不仅能够提高生产效率、降低成本,还能够改善产品质量、…

​ 一文带你了解多文件混淆加密

​🔒 一文带你了解多文件混淆加密 目录 🔒 一文带你了解 JavaScript 多文件混淆加密 ipaguard加密前 ipaguard加密后 ​ 🔒 一文带你了解 JavaScript 多文件混淆加密 JavaScript 代码多文件混淆加密可以有效保护源代码不被他人轻易盗取。…

牛客 HJ106 字符逆序 golang实现

牛客题目算法连接 题目 golang 实现 package mainimport ("fmt""bufio""os" )func main() {str, _ : bufio.NewReader(os.Stdin).ReadString(\n)if len(str) 0 {return } else {newstr:""strLen:len(str)-1for i:strLen;i>0;i-…

小红书达人类型特点有哪些,创作形式总结!

小红书自带的社交电商属性,吸引了众多优秀的内容创作者和品牌达人。他们以不同的风格和主题,赢得了粉丝们的喜爱和关注。今天为大家分享下小红书达人类型特点有哪些,创作形式总结! 1. 内容创作风格 我们从内容上来区分小红书达人类…

Android11编译第七弹:串口文件读写

问题:需要对SIM卡进行管理,支持APP切换SIM卡。此功能需要访问串口文件,并且对串口文件进行读写。APP操作串口文件/dev/ttyUSB1时,串口文件打开失败。 2023-11-23 10:59:44.092 14264-14264 MULTI_CARD_SerialHandle com.wellnkio…

2023.11.24制作一个常用的登录注册模板(包含密码验证、输出格式验证、验证码等功能)

2023.11.24制作一个常用的登录注册模板(包含密码验证、输出格式验证、验证码等功能) 1. 简介2. 功能3. 页面效果3.1 登录页面3.2 忘记密码页3.3 注册页面 1. 简介 比较喜欢简洁风,只是用bootstrap进行简单装饰 制作一个模板,日常…

2000-2022年上市公司全要素生产率LP方法(含原始数据+测算代码do文档+计算结果)

2000-2022年上市公司全要素生产率测算LP法(含原始数据测算代码do文档计算结果) 1、时间:2000-2022年 2、范围:上市公司 3、指标:证券代码、证券简称、统计截止日期、固定资产净额、year、股票简称、报表类型编码、折…

国自然基金项目的题目确定、立项依据、特色与创新、研究内容 目标等,基金撰写的隐藏技巧

目录 一 基金项目申请要求、重点及项目介绍 二 基金的撰写技巧 三 基金撰写的隐藏技巧 四 范例分析及提交前的自我审查 更多应用 基金项目申请需要进行跨学科的技术融合,申请人需要与不同领域结合,形成多学科交叉的研究。基金项目申请在新时期更加注…

函数计算的新征程:使用 Laf 构建 AI 知识库

Laf 已成功上架 Sealos 模板市场,可通过 Laf 应用模板来一键部署! 这意味着 Laf 在私有化部署上的扩展性得到了极大的提升。 Sealos 作为一个功能强大的云操作系统,能够秒级创建多种高可用数据库,如 MySQL、PostgreSQL、MongoDB …

今日祝福语道一声早安,惟愿你时时安好,天天幸福!

1、托太阳公公轻轻的叩醒你沉睡的心灵,将暖暖的阳光洒满你全身,愿你精神抖擞信心百倍的迎接新的一天,朋友,早安! 2、一天中,第一个叫醒你的是闹钟,第一眼看到的是阳光,第一件要做的事…

竹云参编《公共数据授权运营平台技术要求》团体标准正式发布

2023年11月23日,第二届全球数字贸易博览会“数据要素治理与市场化论坛”于杭州成功召开,国家数据局党组书记、局长刘烈宏,浙江省委常委、常务副省长徐文光出席会议并致辞。会上,国家工业信息安全发展研究中心发布并解读了我国首部…

走近科学之《MySQL 的秘密》

走近科学之《MySQL 的秘密》 mysql 存储引擎、索引、执行计划、事务、锁、分库分表、优化 1、存储引擎(storage engines) 存储引擎规定了数据存储时的不同底层实现,如存储机制、索引、锁、事务等。 可以通过 show engines 命令查看当前服务…

RabbitMQ基础教程

1.什么是消息队列 消息队列(Message Queue),我们一般简称为MQ。消息队列中间件是分布式系统中重要的组件,具有异步性、松耦合、分布式、可靠性等特点。用于实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少…

利用企业被执行人信息查询API保障商业交易安全

前言 在当今竞争激烈的商业环境中,企业为了保障商业交易的安全性不断寻求新的手段。随着技术的发展,利用企业被执行人信息查询API已经成为了一种强有力的工具,能够帮助企业在商业交易中降低风险,提高合作的信任度。 企业被执行人…

性能优化中使用Profiler进行页面卡顿的排查及解决方式

文章目录 一、前言二、页面卡顿的排查方式1、耗时操作的监控2、页面卡顿的监控 三、参考链接 一、前言 程序的优化在做过线上bug处理,布局层级优化,项目依赖库版本更新,重复库合并,删除未使用的资源,删除冗余的库&…