空间曲线的线性参数插值
在断层曲面拟合的过程中,发现当解释的空间数据点过于稀疏的化,其断层面拟合的效果较差,我们采用空间曲线线性插值加密的算法,增加插值控制点的数量,改善插值的效果。
1.1 问题描述即算法描述
已知空间三维离散折线 \(l=(p_1,p_2,...,p_i,...,p_n)\) 上有 \(n\)个点 \(p_i(x_i,y_i,z_i)\),假设点与点之间是线性渐变的,我们将在折线段中两点中添加\(m\)个点,即 \({...,p_{i},q_{1}^{i},q_2^{i},q_{3}^i,...,q_{j}^{i},...,q_{m}^{i},p_{i+1},...}\) , 其中\(q_{j}^i=(x_{j}^i,y_{j}^i,z_j^i)\) 为待插值点,其中 引入参数\(t_j\), 其待插值点的坐标如下:
\[\begin{equation} \begin{aligned} x_j^{i}=(1-t_j)x_i+t_jx_{i+1} \\ y_j^{i}=(1-t_j)y_i+t_jx_{i+1} \\ z_j^{i}=(1-t_j)z_i+t_jz_{i+1} \\ \end{aligned} \tag{1.1.1} \space (i=1,2,3,...,n-1) and(j=1,2,3,..,m) \end{equation} \]其中 插值参数\(t_j\):
\[\begin{aligned} \begin{split} t_j &=j\Delta{t}\\ \Delta{t}&=1/(m+1)\\ j&=1,2,3,...,m \end{split} \end{aligned} \tag{1.2.1} \]1.2 算法代码
1.断层插值算法:
%函数的功能:绘制断层线的解释网格
%函数的描述:利用线性插值断层线解释控制点加密
%函数的使用:y=func(input1,input2)
%输入:
% X-待插值的断层解释控制点 X坐标向量 (n)
% Y-待插值的断层解释控制点 Y坐标向量 (n)
% T-待插值的断层解释控制点 T(或Z)坐标向量 (n)
% CDP-待插值的断层解释控制点 CDPIndex 向量 (n)
% LINE-待插值的断层解释控制点 LINEIndex向量 (n)
% faultIndex-待插值的解释控制点 断层编号向量 (n)
% n-每个折线加密点数
%输出:
% X_inter-线性插值后的断层解释控制点X坐标向量
% Y_inter-线性插值后的断层解释控制点Y坐标向量
% T_inter -线性插值后的断层解释控制点T坐标向量
% CDP_inter-线性插值后的断层的插值控制点CDPIndex向量
% LINE_inter-线性插值后的断层的插值控制点LINEIndex向量
% faultIndex_inter-线性插值后的断层的插值控制点断层编号向量
%注意事项:利用函数的适用范围。
%文档日期:
%标签:
%创建日期:
%最后更新日期:
function [X_inter,Y_inter,T_inter,CDP_inter,LINE_inter,faultIndex_inter]=interfaultInline(X,Y,T,CDP,LINE,faultIndex,n)
faultIndexArray=unique(faultIndex);
nfaultline=length(faultIndexArray);
X_inter=[];
Y_inter=[];
T_inter=[];
CDP_inter=[];
LINE_inter=[];
faultIndex_inter=[];
t=linspace(0,1,n+2);
for ifault=1:nfaultline
faltIndexTemp=faultIndexArray(ifault);
indexSubTemp=find(faultIndex==faltIndexTemp);
X_temp=X(indexSubTemp);
Y_temp=Y(indexSubTemp);
T_temp=T(indexSubTemp);
CDP_temp=CDP(indexSubTemp);
LINE_temp=LINE(indexSubTemp);
nSample=length(indexSubTemp);
nInterSample=(nSample-1)*n+nSample
Xinter_temp=zeros(nInterSample,1);
Yinter_temp=zeros(nInterSample,1);
Tinter_temp=zeros(nInterSample,1);
CDPinter_temp=zeros(nInterSample,1);
LINEinter_temp=zeros(nInterSample,1);
faultIndexinter_temp=zeros(nInterSample,1);
for isample=1:nSample-1
for iter=1:n+2
Xinter_temp((isample-1)*(n+1)+iter)=(1-t(iter))*X_temp(isample)+t(iter)*X_temp(isample+1);
Yinter_temp((isample-1)*(n+1)+iter)=(1-t(iter))*Y_temp(isample)+t(iter)*Y_temp(isample+1);
Tinter_temp((isample-1)*(n+1)+iter)=(1-t(iter))*T_temp(isample)+t(iter)*T_temp(isample+1);
CDPinter_temp((isample-1)*(n+1)+iter)=(1-t(iter))*CDP_temp(isample)+t(iter)*CDP_temp(isample+1);
LINEinter_temp((isample-1)*(n+1)+iter)=(1-t(iter))*LINE_temp(isample)+t(iter)*LINE_temp(isample+1);
faultIndexinter_temp((isample-1)*(n+1)+iter)=ifault;
end
end
X_inter=[X_inter;Xinter_temp];
Y_inter=[Y_inter;Yinter_temp];
T_inter=[T_inter;Tinter_temp];
CDP_inter=[CDP_inter;CDPinter_temp];
LINE_inter=[LINE_inter;LINEinter_temp];
faultIndex_inter=[faultIndex_inter;faultIndexinter_temp];
end
end
2.断层解释线绘制代码
function drawfaultline(X,Y,T,Index,method)
%函数的功能:绘制断层线的解释网格
%函数的描述:
%函数的使用:y=func(input1,input2)
%输入:
% input1:
% input2:
%输出:
% Y:
%例子:y=func(1,'type1');
%注意事项:利用函数的适用范围。
%文档日期:
%标签:
%创建日期:
%最后更新日期:
maxIndex=max(Index);
minIndex=min(Index);
k=1;
for index=minIndex:maxIndex
indexfalut=find(Index==index);
faultlineX=X(indexfalut);
faultlineY=Y(indexfalut);
faultlineT=T(indexfalut);
k=k+1;
plot3(faultlineX,faultlineY,faultlineT,method);
hold on
end
set(gca,'Zdir','reverse');
daspect([1,1,1]);
hold off
end
1.3 算法效果及案例
断层线插值案例
clc
clear all
close all
%% 读取断层面散点数据
pointdata=load("./data/F10_GeoInline.txt");
pointdata1=load("./data/F10_GeoXline.txt");
maxIndexLine=max(pointdata(:,6));
%% 断层线数据加密
Xpoint=[pointdata(:,1);pointdata1(:,1)];
Ypoint=[pointdata(:,2);pointdata1(:,2)];
Tpoint=[pointdata(:,3);pointdata1(:,3)];
LINEpoint=[pointdata(:,4);pointdata1(:,4)];
CDPpoint=[pointdata(:,5);pointdata1(:,5)];
INDEXpoint=[pointdata(:,6);pointdata1(:,6)+1+maxIndexLine];
n=20;
[X_inter,Y_inter,T_inter,CDP_inter,LINE_inter,faultIndex_inter]=interfaultInline(Xpoint,Ypoint,Tpoint,CDPpoint,LINEpoint,INDEXpoint,n);
Xpoint1=X_inter;
Ypoint1=Y_inter;
Tpoint1=T_inter;
LINEpoint1=LINE_inter;
CDPpoint1=CDP_inter;
INDEXpoint1=faultIndex_inter;
%%
figure(1)
subplot(1,2,1)
drawfaultline(Xpoint,Ypoint,Tpoint,INDEXpoint,'-or');
xlabel("X");
ylabel("Y");
zlabel("Z");
title("插值前断层解释控制点")
grid on
subplot(1,2,2)
drawfaultline(Xpoint,Ypoint,Tpoint,INDEXpoint,'or');
hold on
drawfaultline(Xpoint1,Ypoint1,Tpoint1,INDEXpoint1,'.b');
xlabel("X");
ylabel("Y");
zlabel("Z");
title("插值后断层解释控制点")
grid on
断层插值后的效果
标签:temp,断层,插值,曲线,iter,线性,inter,isample From: https://www.cnblogs.com/GeophysicsWorker/p/18638932