问题提出
网格划分在很多领域都会使用,本次问题是插值需要采样,但区域是一个梯形。本文在此基础上进行了泛化,相关结论应该在CFD网格划分会有提及。本文应该只是重复造轮子。
问题描述
从矩形域的等距网格划分形变为任意四边形域的等距网格划分。前提条件是,边界为直线,定点数为4.
例子,矩形域变为等腰梯形。
clear;clc
[x,y]=meshgrid(linspace(0,1,25));
x=(x-0.5).*(y*12+(1-y)*10)+6;
y=3*y;
mesh(x,y,0*x,y); % 颜色显示
view(2)
技术路线
首先用待定系数法,设二元二次的转换函数,然后转化为两个独立的线性方程组求解。具体过程不再叙述,详见图片。
代码
clear
% coordinate_P=[x1,y1,x2,y2,x3,y3,x4,y4];
% coordinate_P_star=[x1s,y1s,x2s,y2s,x3s,y3s,x4s,y4s];
% 输入P点坐标 coordinate_P
x1=0;y1=1;
x2=1;y2=1;
x3=1;y3=0;
x4=0;y4=0;
% 输入P※点坐标 coordinate_P_star
x1s=0;y1s=3;
x2s=12;y2s=3;
x3s=11;y3s=0;
x4s=1;y4s=0;
% 系数矩阵A
matrix_A=[x1*y1, x1, y1, 1;
x2*y2, x2, y2, 1;
x3*y3, x3, y3, 1;
x4*y4, x4, y4, 1];
matrix_B1=[x1s;x2s;x3s;x4s];
matrix_B2=[y1s;y2s;y3s;y4s];
% 解线性方程组
matrix_C1=matrix_A\matrix_B1;
matrix_C2=matrix_A\matrix_B2;
% 初始矩形网格
[x,y]=meshgrid(linspace(0,1,25));
% 转换函数
x_new=matrix_C1(1).*x.*y+matrix_C1(2).*x+matrix_C1(3).*y+matrix_C1(4);
y_new=matrix_C2(1).*x.*y+matrix_C2(2).*x+matrix_C2(3).*y+matrix_C2(4);
% 显示有颜色的网格
mesh(x_new,y_new,0*x_new,y_new);
view(2)
效果
三角形域 直角梯形域 任意西四边形 n边形(n>4) 划分为多个四边形就好了。
问题
形变后的网格不等距,稀疏差距非常大,MATLAB有mesh的工具,可以使用。
官方pdemesh
https://www.mathworks.com/help/pde/ug/pde.pdemodel.generatemesh.html
DISTMESH拓展包
https://people.sc.fsu.edu/~jburkardt/m_src/distmesh/distmesh.html