您好,欢迎访问三七文档
当前位置:首页 > 中学教育 > 初中教育 > 四边形网格自动生成v101
1二维多边形单连通域自动生成四边形和三角形混合网格算法版本控制版本修订内容日期修改人审核人V1.0.1起草设计文件2011/12/06张宏类:CMeshingQuad函数:voidCMeshingQuad::AutoQuad2D_SCD(intnBndPoint,Vector4*pVex2D)文件:Mesh2D.cpp,Mesh2D.h算法步骤:1.输入参数:多边形区域的边界点数nBndPoint按顺序输入边界点坐标数组pcVex2D,每个点包括x,y坐标最大四边形内角fMaxQuadAngle单元控制尺寸fElmSize2.构造线段数组pcLine,每个线段包括首点号,末点号,顺序与当前边界线方向一致3.计算边界点内角pfAng,内角范围[0,180]度4.计算区域范围及网格数nGridX、nGridY,便于快速判断线段相交5.将已有线段加入对应的网格数组pGrid,每个网格包括线段数、线段ID数组6.建立边界线链表vBndLine(线段编号iLine,前一条线段编号iLast,后一条线段编号iNext),也可以定义为边界点链表vBndPoint(结点编号iNode,前结点编号iLast,后结点编号iNext)7.初始化生成单元的边界线链表序号iStartLine=-18.如果边界线数4,则开始在边界上生成单元1)由相邻角点生成单元:搜索所有边界线链表,若线段两端点n1,n2的内角θ1、θ2均小于fMaxQuadAngle,并且新线n4,n3与其它线不相交:2若新线段n4,n3长度大于1.5*fElmSize,则生成1个三角形、1个四边形、1个结点、3个线段,将新线加入网格,更新边界线链表,更新n3,n4,n5的内角;(1)θ1θ2(2)θ1θ2若新线与其它线段相交,则继续循环搜索。否则,生成1个四边形,1个线段,将新线加入网格,更新边界线链表,更新n3,n4的内角。若至少生成了1个单元,则直接返回步骤-8。2)若iStartLine==-1,则寻找边界线左端点最小内角,得到边界线号iLine;否则设置iLine=iStartLine;3)由单个较小内角生成三角形单元:若线段iLine首端点n1的内角θ1小于fMaxTriAngle,并且新线n4,n2与其它线不相交,则生成1个三角形,1个线段,将新线加入网格,更新边界线链表,更新n2,n4的内角,返回步骤-8。34)由单个较大内角生成单元:若线段iLine首端点n1的内角θ1大于fMaxTriAngle并且小于fMaxQuadAngle,并且新线n4,n3、n3,n2与其它线不相交,则生成1个四边形,2个线段,将新线加入网格,更新边界线链表,更新n4,n3,n2的内角,返回步骤-8。可考虑:若θ1角度过大,则生成1个三角形和1个四边形。5)若上面步骤中没有生成任何单元,需要放宽条件,避免死循环,然后返回步骤-8。具体为以下几种方法的组合:移到下一条边界线段iLine++,直到遍历完所有边界线每次fMaxQuadAngle增加10度,直到接近180度每次fMaxTriAngle增加10度,直到接近180度每次fElmSize增加10%,无最大值限制每次成功单元生成后自动恢复到各个参数的初始值若以上方法均不奏效,则达到最大值限制后跳出循环,提示用户网格生成失败9.如果边界线数=3,则生成1个三角形单元,跳过步骤-10。10.如果边界线数=4,若有内角fMaxQuadAngle则生成2个三角形单元;否则生成1个四边形单元。11.遍历所有四边形单元,拆分内角过大的四边形为2个三角形。412.遍历所有三角形单元,合并共线的2个三角形,条件是合并后内角要小于fMaxQuadAngle。13.结点光滑:按设定次数进行Laplace光滑处理,相邻点权重为1,对角点权重为2。
本文标题:四边形网格自动生成v101
链接地址:https://www.777doc.com/doc-2549701 .html