当前位置:首页 > 代码 > 正文

三角网格简化代码(简化网格线)

admin 发布:2022-12-19 13:25 143


今天给各位分享三角网格简化代码的知识,其中也会对简化网格线进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

[求助]MIKE中三角形网格的处理问题

在岛区域中Insert polygons点,然后选select polygons选中此点,右击选择property,选择Exclude from triangulation选项(默认值)

光栅化阶段:三角形设置、三角形遍历、像素着色、合并

光栅化阶段

光栅化阶段分了四个步骤:三角形设置、三角形遍历、像素着色、合并。

三角形设置:

光栅化的第一个流水线阶段是三角形设置,这个阶段会计算光栅化一个三角网格所需的信息。具体来说,上一个阶段输出的都是三角网格的顶点,即我们得到的是三角网格每条边的两个端点。但如果要得到整个三角网格对像素的覆盖情况,我们就必须计算每条边上的像素坐标。为了能够计算边界像素的坐标信息,我们就需要得到三角形边界的表示方式。这样一个计算三角网格表示数据的过程就叫做三角形设置。它的输出是为了给下一个阶段做准备。

三角形遍历:

三角形遍阶段将会检查每个像素是否被一个三角网格所覆盖。如果被覆盖的话,就会生成一个片元,而这样一个找到哪些像素被三角网格覆盖的过程就是三角形遍。三角形遍历阶段会根据上一个阶段的计算结果来判断一个三角网格覆盖了哪些像素,并使用三角网格3个顶点的顶点信息对整个覆盖区域的像素进行插值。下图展示了三角形遍历阶段的简化计算过程。

这一步的输出就是得到一个片元序列。需要注意的是,一个片元并不是真正意义上的像素,,而是包含了很多状态的集合,这些状态用于计算每个像素的最终颜色。这些状态包括了(但不限于)它的屏幕坐标、深度信息,以及其他从几何阶段输出的顶点信息,例如法线、纹理坐标等。

像素着色: 这一阶段在《UnityShader入门精要》讲的是片元着色器(Fragment Shader)。

片元着色器的输入是上一个阶段对顶点信息插值得到的结果,更具体来说,是根据那些从顶点着色器中输出的数据插值得到的。而它的输出是一个或者多个颜色值。下图显示了这样一个过程。这一阶段可以完成很多重要的渲染技术,其中最重要的技术之一就是纹理采样。为了在片元着色器中进行纹理采样,我们通常会在顶点着色器阶段输出每个顶点对应的纹理坐标,然后经过光栅化阶段对三角网格的3个顶点对应的纹理坐标进行插值后,就可以得到其覆盖的片元的纹渲染流水线坐标了。

合并阶段: 这一阶段在OpenGL中称为逐片元操作。

这一阶段有几个主要任务。

(1)决定每个片元的可见性。这涉及了很多测试工作,例如深度测试、模板测试等。

(2)如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区 P的颜色 ,或者说是混合。

这里的合并阶段内容很多涉及的知识点也相对较多,后面会单独开一篇来讲。

所以本篇的内容就讲到这里,内容比较少,但是积少成多。慢慢深入,加油!

本篇参考文献:

《UnityShader入门精要》-- 冯乐乐,人民邮电出版社,2018年3月第11次印刷。请支持正版!

用matlab画网格:我知道了很多点的坐标,比如(0,0)(2,1)(6,5),如何把这三点连接成一个三角形?

建立向量

x=[0 2 6]; %所有点的横坐标

y=[0 1 5] ; %与之对应的纵坐标

patch(x,y,'w'); %w表示颜色为白色,也可以改为b,r等其他颜色填充

matlab中绘制带参数的三角网格图??

matlab中绘制带参数的三角网格图,需要用tri = delaunay(x,y);和trimesh(tri,x,y,z)这两个函数配合使用。

实现代码为

[r,t]=meshgrid(0:.025:sqrt(3),pi*(0:.1:2));

x=r.*cos(t);y=r.*sin(t);z=(4-r.^2).^(1/2);

tri = delaunay(x,y);

trimesh(tri,x,y,z)

xlabel('x');ylabel('y');zlabel('z')

运行结果

网格光顺

网格光顺是通过改变结点坐标的方式来提高网格整体质量的一项技术。对于某一个结点来讲,该结点可能位于网格边界或内部,相应的,该结点被称为边界结点或内部结点。通常情况下,为了保持与其他网格之间拓扑相容,网格光顺所能够移动的只能是内部结点,而固定边界结点。

网格光顺最常用的方法是Laplacian光顺,Laplacian光顺是将某一结点移动到与之相邻结点的中心。这种方法,算法简单,程序实现容易,但计算量大。本节介绍的另外一种网格光顺方法是优化平面及曲面三角网格的直接法,该方法的主要思想是通过移动结点使每个三角形都尽可能地趋近于正三角形,从而达到优化网格的效果。

3.5.1.1 直接法

Balendran于1999年提出了优化平面及曲面三角网格的直接法,该方法的主要思想是将网格作为可变形体,在不改变网格拓扑关系的前提下,通过移动结点使每个三角形都尽可能地趋近于正三角形,从而达到优化网格的效果(Balen-dran,1999)。在移动结点时需要注意该结点是否为约束点,所谓约束点即是在生成初始网格和优化时需要保持位置固定的结点,通常情况下,约束点为网格边界结点和内部“硬”点。优化时只能改变非约束点的位置而保持约束点固定不变。

图3.22 平面坐标系下三角形结点的移动

如图3.22所示,设在平面坐标系{X,Y}中,{Q,R,A}为三角形单元Ti的顶点。直接法优化的过程就是通过移动三角形顶点使其接近正三角形。如图3.22所示,先假设固定三角形的一条边 然后将结点A移动到Ae,使三角形单元Ti成为正三角形,则Ae的坐标为:

三维地质建模方法及程序实现

式(3.1)中,{XeA,YeA}、{XQ,YQ}和{XR,YR}分别为结点Ae、Q和R的坐标。

同理,当分别固定 时,相应地分别移动Q至Qe以及R至Re,也可以按式(3.1)的形式表示Qe与Re。对于任意三角形(顶点按逆时针排序),按照式(3.1),可以将3个结点分别移动后的关系式合写成如下矩阵形式:

三维地质建模方法及程序实现

其中,Ci和Cei分别表示结点i在移动前和移动后的坐标。

采用上述表达方式,可将式(3.2)改写为如下简要形式:

三维地质建模方法及程序实现

式(3.3)中,方程中左侧为一个6×6的对称矩阵,该矩阵为三角形单元中表示3个结点之间相互关系的系数矩阵。可以将该对称矩阵类比为有限元方法中的单元刚度矩阵,对网格中每个三角形单元都可以写出一个类似的矩阵。根据三角网格的拓扑关系,参照有限元方法中通过组装单元刚度矩阵得到总刚度矩阵的方法,将网格中所有三角形单元的“单元刚度矩阵”组装为整个网格的“总刚矩阵”。

式(3.3)所表示的优化方程是针对一个三角形写出的,对于其他三角形均可写出相似的优化方程。根据三角形网格的拓扑关系,采用将网格中所有三角形单元的“单元刚度矩阵”组装为整个网格的“总刚度矩阵”的方法,可以得到整个网格的优化方程。若网格中有n个结点则最终可以形成一个有2n个方程的优化方程组。

图3.23(a)所示为一个十分简单的三角网格,该网格仅由6个结点和5个三角形单元组成;图3.23(b)所示为采用直接法优化后的结果。优化时需要确定哪些结点为约束点,通常情况下,边界结点都为约束点,同时因为初始网格十分简单,不考虑内部“硬”点,故网格中的约束点即为边界结点。

图3.23 直接法优化简例

为了说明如何详细得到整个网格的优化方程组,以图3.24所示的网格为例,分步组建优化方程组。先只考虑三角形单元{0,1,5},该三角形单元的优化方程组如下所示,方程组中除了与结点相关的项外其他都为0。

三维地质建模方法及程序实现

在三角形单元{0,1,5}的基础上考虑三角形单元{1,2,5},得到两个三角形的优化方程组如下所示。

三维地质建模方法及程序实现

按照上述方法类推,得到整个网格的优化方程组如下。

三维地质建模方法及程序实现

将L、M、N、Ci和Cei分别带入上述方程组,最终可以得到一个有12个方程的由结点坐标表示的优化方程。采用迭代法求解最终的优化方程组即可得到优化后所有结点的坐标(表3.1,表3.2)。对于计算中需要考虑的约束点,在迭代时直接跳过,详细处理方法见直接法算法的代码。

表3.1 优化前结点坐标

表3.2 优化后结点坐标

图3.24所示为采用直接法优化三角网格的实例。从整体上看,优化后的网格质量要优于优化前的网格。

图3.24 直接法优化三角网格实例

在VC++环境下,直接法的完整代码如下,参数CSurf*surf表示一个三角网格,其中网格的结点和单元分别保存在成员pNodes和pTrgls中,优化后结点新坐标依旧保存在成员pNodes中,并将原坐标覆盖。

三维地质建模方法及程序实现

三维地质建模方法及程序实现

三维地质建模方法及程序实现

三维地质建模方法及程序实现

3.5.1.2 Laplacian光顺

Laplacian光顺方法是提高网格质量的一种十分简单、有效的方法(Field,1988),该方法将内部结点移至与其相邻的共线结点(也成一阶邻域点)坐标的平均值处,迭代公式为:

三维地质建模方法及程序实现

式中:Ni为内点Pi的邻接结点的个数;Pj为与结点Pi相连接的结点。

图3.25为一个十分简单网格的Laplacian光顺过程,该网格的6个边界点即是1个内部点的所有相邻共线结点,内部点的优化值即是上述6个相邻共线结点坐标的平均值。

图3.25 Laplacian光顺

Laplacian光顺算法的主要步骤如下:

第一步:搜索每个结点的相邻共线结点,这可以通过对网格中的三角形循环得到。三角形的3个顶点互为相邻共线结点,将两两顶点记录为彼此的相邻共线结点。

第二步:对每个结点循环,计算其所有相邻共线结点坐标的平均值,并将结果作为一次迭代优化后的新坐标。当结点为边界结点时,直接跳过,不需要计算。

第三步:反复进行第二步,直到所有结点的新坐标与上一次优化得到坐标的差值小于某个阈值时,迭代结束。上述阈值由人为设定,即迭代收敛要求的精度。最后一次迭代得到的结点坐标即为最终的优化结果。

根据上述算法,在VC++环境下,Laplacian光顺的完整代码如下,参数CSurf*surf表示一个三角网格,其中网格的结点和单元分别保存在成员pNodes和pTrgls中,优化后结点新坐标依旧保存在成员pNodes中,并将原坐标覆盖。

三维地质建模方法及程序实现

三维地质建模方法及程序实现

图3.26所示为采用上述算法和代码优化三角形网格的实例,从图中可以看出,优化后网格质量得到显著提高。

图3.26 Laplacian光顺优化三角形网格实例

带权限定Delaunay三角化的算法步骤及实现

1.二维的算法步骤及实现

带权的限定Delaunay三角剖分(Weighted CDT)的算法的输入是一个包含限定线段和限定点的平面直线图(planar straight line graph,简称PSLG),算法的输出是与限定条件(限定点和限定线段)一致的一个三角形集合。

算法4.7二维的带权限定Delaunay三角剖分

ConformingWeightedDelaunayTriangulation(PSLG)

{

规范化算法

调用算法WeightAssignment2d对PSLG中的点赋权值

建立初始大三角形

调用二维带权Delaunay空洞算法(算法4.2)生成受限点集的带权Delaunay三角剖分;

调用二维恢复受限边的算法(算法4.5)生成边界一致的带权Delaunay三角网格

删除边界外的多余的三角形,得到边界一致的带权限定Delaunay三角剖分

}

2.三维的算法步骤及实现

加权的限定Delaunay剖分的算法步骤:

输入:一个分段线性复合形(a piecewise linear complex)

输出:满足受限条件的具有带权Delaunay性质的四面体集合

算法三维的带权限定Delaunay四面体剖分算法:

ConformingWeightedDelaunayTetrahedralization(PLC)

{

调用算法4.4 WeightAssignment3d对规范化后的点和边赋权值;

建立初始大四面体

for所有的PLC中的平面

将该平面通过坐标变换转换到XOY平面上;

调用算法WeightedConstrainDelaunayTriangulation进行二维的带权限定Delaunay三角剖分

将得到的二维带权限定Delaunay三角网格坐标变换到空间中其原来位置

endfor

调用算法三维带权Delaunay空洞算法生成三维点集的带权Delaunay四面体剖分

调用算法RecoverConformSegments和算法RecoverConformFacets恢复受限边和受限面

删除边界外的多余的四面体,得到边界一致的带权限定Delaunay四面体剖分

}

三角网格简化代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于简化网格线、三角网格简化代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/8775.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载