Matlab三角剖分插值問題分析

目錄

前言

一、問題引入

二、一個例子

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
clcrng(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.pswp.cn/news/165676.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165676.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165676.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

外部中斷為什么會誤觸發?

今天在寫外部中斷的程序的時候,發現中斷特別容易受到干擾,我把手放在對應的中斷引腳上,中斷就一直觸發,沒有停過。經過一天的學習,找到了幾個解決方法,所以寫了這篇筆記。如果你的中斷也時不時會誤觸發&…

數 組

數組格式 普通數組下標是數字 關聯數組下標是字符串 例子: a(10 20 30 40 50) a[0] 10 數組的分類(普通數組和關聯數組) 普通數組 可以不需要手動聲明,直接使用 declare -a 數組名 關聯數組 一定要手動聲明 adeclare …

通過Spring整合MyBatis實現持久層操作

文章目錄 為什么要整合Spring和MyBatis?步驟一:添加依賴步驟二:配置數據源步驟三:配置MyBatis步驟四:創建Mapper接口和XML文件步驟五:使用Mapper接口拓展:事務管理 🎉通過Spring整合…

Leetcode173. 二叉搜索樹迭代器

Every day a Leetcode 題目來源:173. 二叉搜索樹迭代器 解法1:中序遍歷 我們可以直接對二叉搜索樹做一次完全的遞歸遍歷,獲取中序遍歷的全部結果并保存在數組中。隨后,我們利用得到的數組本身來實現迭代器。 代碼&#xff1a…

競賽 : 題目:基于深度學習的水果識別 設計 開題 技術

1 前言 Hi,大家好,這里是丹成學長,今天做一個 基于深度學習的水果識別demo 這是一個較為新穎的競賽課題方向,學長非常推薦! 🧿 更多資料, 項目分享: https://gitee.com/dancheng-senior/pos…

Spark-06:共享變量

目錄 1.廣播變量(broadcast variables) 2.累加器(accumulators) 在分布式計算中,當在集群的多個節點上并行運行函數時,默認情況下,每個任務都會獲得函數中使用到的變量的一個副本。如果變量很…

開啟數據庫審計(db,extended級別或os級別),并將審計文件存放到/home/oracle/audit下

文章目錄 開啟數據庫審計(db,extended級別或os級別),并將審計文件存放到/home/oracle/audit下一. 簡介二. 配置2.1. 審計是否安裝2.2. 審計表空間遷移2.3. 審計參數2.4. 審計級別2.5. 其他審計選項2.6. 審計相關視圖 三. 使用3.1. 開啟/關閉審…

成為獨立開發者有多難

首先自我介紹:我是一名前端開發工程師,7年的前端開發經驗。CSDN 九段刀客_js,vue,ReactNative-CSDN博客,80多萬的訪問量,1萬多的粉絲。 相信80%的程序員的終極夢想都是成為一名獨立開發者,不用找工作有自己的產品可以有睡后收入。…

深度學習模型訓練計算量的估算

深度學習模型訓練計算量的估算 方法1:基于網絡架構和批處理數量計算算術運算次數前向傳遞計算和常見層的參數數量全連接層(Fully connected layer)參數浮點數計算量 CNN參數浮點數計算量 轉置CNN參數浮點數計算量 RNN參數浮點數計算量 GRU參數…

刷題學習記錄(含2023ISCTFweb題的部分知識點)

[SWPUCTF 2021 新生賽]sql 進入環境 查看源碼,發現是get傳參且參數為wllm fuzz測試,發現空格,,and被過濾了 同樣的也可以用python腳本進行fuzz測試 import requests fuzz{length ,,handler,like,select,sleep,database,delete,h…

java學習part09類的構造器

1. 2.默認構造器 如果沒有顯式定義任何構造器,系統會默認加一個默認構造器。 如果定義了,則不會有默認構造器。 默認構造器的權限和類的權限一樣,類是public構造器就是public,類是缺省默認構造器就是缺省 反編譯之后添加的構造…

解決DaemonSet沒法調度到master節點的問題

最近在kubernetes部署一個springcloud微服務項目,到了最后一步部署邊緣路由:使用nginx-ingress和traefik都可以,必須使用DaemonSet部署,但是發現三個節點,卻總共只有兩個pod。 換句話說, DaemonSet沒法調度…

UML建模圖文詳解教程05——包圖

版權聲明 本文原創作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文參考資料:《UML面向對象分析、建模與設計(第2版)》呂云翔,趙天宇 著 包圖概述 包圖(package diagram)是用來描述模型中的…

一個最簡單的工業通訊數據分析例子

1.背景 對工業設備的通訊協議進行分析可以幫助我們更好地理解其工作原理和相關技術,并且有助于以下幾個方面: 1. 優化工業設備的通訊效率:了解通訊協議的細節可以幫助我們找到通訊效率低下的原因并進行優化,提高設備的通訊效率和…

Axioss筆記

一、Get請求 // 請求頭攜帶參數,案例:?uid1001 axios.get(http://localhost:8080/user/api/v1/user/query, {params: {uid: 1001}}).then(res > {console.log(res.data) }).catch(err > {console.log("請求錯誤" err) }).finally(() …

MySQL 8 配置文件詳解與最佳實踐

MySQL 8 是一款強大的關系型數據庫管理系統,通過適當的配置文件設置,可以充分發揮其性能潛力。在這篇博客中,我們將深入探究 MySQL 8 常用的配置文件,并提供一些建議,幫助您優化數據庫性能。 配置文件概覽 在 MySQL …

【華為OD題庫-030】阿里巴巴找黃金寶箱(V)-java

題目 一貧如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;無意中發現了強盜集團的藏寶地&#xff0c;藏寶地有編號從0-N的箱子&#xff0c;每個箱子上面貼有一個數字.阿里巴巴念出一個咒語數字k(k<N),找出連續k個寶箱數字和的最大值&#xff0c;并輸出該最大值。 輸入描述 第…

攔截器的使用

攔截器&#xff08;Interceptor&#xff09;是一種在應用程序中用于干預、修改或攔截請求和響應的組件&#xff0c;是AOP 編程的一種實踐&#xff0c;和過濾器一樣都是一種具體的AOP實現。它可以在請求被發送到目標處理程序之前或之后&#xff0c;對請求進行預處理或對響應進行…

【數據結構】二叉樹概念 | 滿二叉樹 | 完全二叉樹

二叉樹的概念 二叉樹在實踐中用的很多。 一棵二叉樹是結點的一個有限集合&#xff0c;該集合&#xff1a; 或者為空&#xff1b;由一個根結點加上兩棵別稱為左子樹和右子樹的二叉樹組成。二叉樹最多兩個孩子。 這里注意&#xff1a;二叉樹并不是度為2的樹。 二叉樹的度最大值是…

Go lumberjack 日志輪換和管理

在開發應用程序時&#xff0c;記錄日志是一項關鍵的任務&#xff0c;以便在應用程序運行時追蹤問題、監視性能和保留審計記錄。Go 語言提供了靈活且強大的日志記錄功能&#xff0c;可以通過多種方式配置和使用。其中一個常用的日志記錄庫是 github.com/natefinch/lumberjack&am…