四边形网格的形态好,计算精度高。四边形网格的生成严重依赖于几何形状,对简单的平面区域生成较为简单;对复杂的区域,,可以先将区域分割为简单的图形,再划分。有如下方法:有限元差值法,扫略法,合并法。
FEInterpolation::FEInterpolation( Vertex& v0,Vertex& v1, Vertex& v2, Vertex& v3, double len) {
//以四条边中,相邻的两条最长边作为划分个数依据
double dis01 = v0.distance(v1);
double dis12 = v1.distance(v2);
double dis23 = v2.distance(v3);
double dis30 = v3.distance(v0);
double maxU = std::max(dis01, dis23);
double maxV = std::max(dis12, dis30);
int u = int(maxU / len);
int v = int(maxV / len);
double uParaInterv = 2.0 / u;
double vParaInterv = 2.0 / v;
for (int i = 0; i < u; i++) {
double epsi = -1 + i * uParaInterv;
for (int j = 0; j < v;) {
//计算H值
double eta = -1 + j * vParaInterv;
double H1 = (1 - epsi)*(1 - eta) / 4;
double H2 = (1 + epsi)*(1 - eta) / 4;
double H3 = (1 + epsi)*(1 + eta) / 4;
double H4 = (1 - epsi)*(1 + eta) / 4;
//v0
Vertex m_v0 = v0 * H1 +v1 * H2 + v2 * H3 + v3 * H4;
//计算v1, i+1,
i++;
epsi = -1 + i * uParaInterv;
H1 = (1 - epsi)*(1 - eta) / 4;
H2 = (1 + epsi)*(1 - eta) / 4;
H3 = (1 + epsi)*(1 + eta) / 4;
H4 = (1 - epsi)*(1 + eta) / 4;
Vertex m_v1 = v0 * H1 + v1 * H2 + v2 * H3 + v3 * H4;
//计算v2,j+1
j++;
eta = -1 + j * vParaInterv;
H1 = (1 - epsi)*(1 - eta) / 4;
H2 = (1 + epsi)*(1 - eta) / 4;
H3 = (1 + epsi)*(1 + eta) / 4;
H4 = (1 - epsi)*(1 + eta) / 4;
Vertex m_v2 = v0 * H1 + v1 * H2 + v2 * H3 + v3 * H4;
//计算v4,i--;
i--;
epsi = -1 + i * uParaInterv;
H1 = (1 - epsi)*(1 - eta) / 4;
H2 = (1 + epsi)*(1 - eta) / 4;
H3 = (1 + epsi)*(1 + eta) / 4;
H4 = (1 - epsi)*(1 + eta) / 4;
Vertex m_v3 = v0 * H1 + v1 * H2 + v2 * H3 + v3 * H4;
QUAD quad(m_v0, m_v1,m_v2, m_v3);
quads.push_back(quad);
}
}
}
这两种都可以通过衡量三角形与四边形质量来解决。
3.1 质量参数
临界值γ定义为允许合并的最小值。
合并算法的步骤如下:
计算三角形每条边的β值,如果某条边没有相邻三角形,β值设定为-1,意味着此边不能删除,是边界。
合并,依次查看三角形的每条边,如果β值大于临界值γ,合并。并且将合并前三角形的其他四条边的β值赋值为-1(因为四边形的边界再不能被删除);
继续合并,直到所有边都不能被合并。
3.3 临界值γ的影响
4. 直接法
将区域分割为,能满足第1,2节所示的几何,划分好子几何后,拼接起来即可。
此类方法是采用类似AFT的思想,以一条边界为前沿,搜索四边形。难点在于边界的填充处理。
4.3 背景网格方法
采用四叉树管理区域,此时不再是三角形,而是直接生成四边形。难点在于边界、过渡处网格的处理。
当然,还有基于标架场和黎曼度量的方法。
路漫漫其修远兮,共勉 。
参考:
Finite Element Mesh Generation
联系客服