非均匀网格

非均匀网格
定义
可以引入新的点(Steiner Point)生成三角剖分
称为Steiner Triangulation(Steiner三角剖分)
目的
让三角剖分后的结果每个三角形的每个角度都在45 - 90中
且三角形数量少
且三角形大小变化均匀
基于四叉树的非均匀网格生成算法:
名词
每个结点代表一个正方形,结点的四个孩子分别代表其父亲正方形的四个象限(quadtree subdivision,四叉树划分)
有些边界上的结点可能多于4个顶点,仍称之为正方形;正方形顶点称为角顶点(corner vertex)
连接两个相邻顶点的为侧边side,完全落在一个边上的是edge;邻居:两个正方形共用一条边
用四叉树保存平面上的一组点;只要某个正方形中包含的点多于一个,就递归进行分割(有点类似德劳内三角划分的桶结构)。
分析
初始正方形:点集的最小包围正方形
四叉树会很不均匀,但有极限:
深度不超过log(s(初始正方形边长)/c(各点中最近距离)) + 3/2
n个点,d深度的四叉树,节点数为O((d + 1)*n),可在O((d + 1)*n)时间构造出来
邻居查找
某个正方形的邻居要么是当前爹爹的孩子(同系),要么是它爹爹邻居的后代或者他爹爹邻居本人
所以可以得到:邻居查找时间复杂度为O(d(深度) + 1)
以上的四叉树很不平衡(面积很大的正方形与面积很小的正方形相邻)
平衡四叉树
引入一种四叉树变种:平衡四叉树(balanced quadtree):任何邻居正方形的边长不超过两倍
只是需要一个平衡化的函数,在之前的四叉树基础上操作即可
算法
//将四叉树变为平衡四叉树
quadtree BalanceTheQuadtree(quadtree qdtree) {
queue leavesQ;
while(!leavesQ.empty()) {
leaf topLeaf = leavesQ.top();
if(needSplit(topLeaf ,qdtree)) {
Block blockTopLeaf = LeaveToBlock(topLeaf);//将topLeave生成内部点;
qdtree.AddLeave(sonA, sonB, sonC, sonD);//其四个孩子都是叶子(是其四个象限);
if(haveaPoint(blockTopLeaf)) {//如果topLeave中有一个点
//从blockTopLeaf中取出,存入对应的新的叶子
}
//将四个新叶子插入leavesQ;
//检查topLeaf的各个邻居,看是否需要分割
//如果某些邻居需要分分割,将其加入到leavesQ
}
}
return qdtree;
}

//是否需要将topLeaf进行分割
bool needSplit(leaf topLeaf, quadtree qdtree) {
通过邻居查找算法,查看附近的边是否是自己的一半以内
}
拓展
八叉树
渲染/光线追踪
弹道轨迹
总之就是位置确定相关
从四叉树到网格
构造四叉树的递归终止条件:知道正方形不在于任何目标边界相交,或者正方形边长缩短到一个单位,就不再继续细分。
一般考虑:对于内部没有边穿过的正方形,为他们添加一条对角线即可。但这样并不是一致的。
平衡化四叉树后按照如下算法划分三角形:
两种情况:
a、侧边内部不含顶点,直接一条对角线划分正方形
b、侧边有顶点,则根据平衡结果一定是侧边中点,再此正方形中心加入Steiner点,然后链接边上所有顶点。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
确实,使用交错网格有限差分法(Staggered Grid Finite Difference Method)可以计算二次电磁场,而对于均匀网格和Dirichlet边界条件,以下是一个使用Fortran编程实现的基本框架: 首先,你需要定义网格大小和边界条件。假设你的网格大小为nx * ny,其中nx和ny分别是x和y方向的网格点数。定义一个二维数组来存储电磁场:Ex(nx, ny),Ey(nx, ny),Hz(nx, ny)。 接下来,你需要初始化边界条件。对于Dirichlet边界条件,你可以将边界上的电场分量设置为指定的边界值。例如,如果左边界的电场Ex的边界值为E_left,则可以在循环中设置Ex(1, j) = E_left,其中j从1到ny。 然后,你可以在内部网格点上使用有限差分方法来计算电场和磁场的更新。对于均匀网格,你需要考虑不同位置的网格间距。假设在x方向上,第i个网格点的间距为dx(i),在y方向上,第j个网格点的间距为dy(j)。使用中心差分公式来计算电场和磁场的更新: Ex(i, j) = Ex(i, j) + (dt / (eps(i, j) * dx(i))) * (Hz(i, j) - Hz(i-1, j)) Ey(i, j) = Ey(i, j) + (dt / (eps(i, j) * dy(j))) * (Hz(i, j) - Hz(i, j-1)) Hz(i, j) = Hz(i, j) + (dt / (mu(i, j))) * ((Ex(i, j+1) - Ex(i, j)) / dy(j) - (Ey(i+1, j) - Ey(i, j)) / dx(i)) 其中,dt是时间步长,eps(i, j)和mu(i, j)分别是介质在第(i, j)个网格点的电容率和磁导率。 最后,你可以根据需要的时间步数进行循环迭代,以计算电磁场的演化。 请注意,以上只是一个基本的实现框架,你可能需要根据具体问题进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值