大家好,我是讯享网,大家多多关注。
高水平的科研成果必须通过高水平的数据可视化呈现给编辑、审稿人和读者!尤其是三维数据的可视化尤为重要。如果能把自己研究成果的三维数据以严谨、准确、美观的方式呈现出来,无疑是加分项,也可能是打动编辑和审稿人的法宝!
三维数据可视化的普适方法
三维数据可视化的最终解决方案是通过非结构化网格来表示数据,然后用一些三维可视化软件就可以很容易地绘制出来。我主要推荐3D可视化的四小龙:Tecplot,Paraview,Python,GMT。子刊《自然》作者手把手教,推出3D数据可视化系列教程,约三小时4K教学视频及全部代码。本文是系列教程的第二部分。通过本文底部的“了解更多”按钮观看所有密集视频。本文是系列教程的第三部分。
幻灯片预览
这里的幻灯片预览不好,只能放一张幻灯片。请使用“了解更多”按钮体验更好的结果。
视频预览
视频加载…
重点和难点是数据格式的转换,难点是对VTK非结构化网格数据格式VTU的理解。如果是第一次听说这个概念,你得花点时间看我的视频或者上网搜索一些资料来学习。而且在文末的所有视频教程中,都详细讲解了如何将XYZ 3D坐标转换成VTU格式,并附上了相应的代码,以供参考和学习。
三角网格的强大和通用性
三角形是最基本的面元,而四面体是最基本的体元。所以任何曲面都可以用一系列三角形来拓扑表示,而任何体积都可以用四面体来表示,也就是说非结构化网格是最通用最通用的,这也是为什么我称非结构化网格为终极解。
用一个不规则的截面不能拼在一起的例子。一般很多人和软件(比如Surfer,Voxler)都喜欢使用规则的网格数据。当然,规则网格数据有它的优势,但是它不能很好的表达曲面或曲线,如下图所示:
规则网格的剖面无法贴合
视角11视角
视角22视角
局部放大,看清网格结构局部放大可以清楚地看到网格结构。
非规则三角网实现完美贴合
视角1不规则三角剖分实现完美拟合透视1
视角22视角
局部放大,看清网格结构局部放大可以清楚地看到网格结构。
这也是本教程的重要部分(通过“了解更多”查看所有视频)
规则网格转VTU的关键代码预览
每个人遇到的情况都不一样,所以一定要把自己的数据转换或者保存成通用的三维数据格式(比如VTU格式),才能被一些三维软件读取,玩得开心。所以,学习一点编程技巧,对自定义和转换自己数据的格式有很大的帮助。
defconvertDEM2VTU(DEMgrd,scale_z=10,scale _ coord = 1):ext = DEMgrd . split(& # 39;。’)[-1]fname = DEMgrd[0:len(DEMgrd)-len(ext)-1]# 1 . grdtoxyzos . system(& # 39;gmtgrd2xyz & # 39+DEMgrd+& # 39;& gt’+fname+& # 39;。xyz & # 39)cmd _ lon lat 2 UTM = str(& # 34;awk & # 39{打印,,*%f,$ 3 } & # 39;% s . XYZ | cs2cs+proj = lat lon+to+proj = t merc+datum = Potsdam+lon _ 0 = % f+lat _ 0 = % f+x _ 0 = % f+y _ 0 = % f & gt;% s _ UTM.xyz & # 34%(scale_z,fname,lon0,lat0,x0,y0,fname))OS . system(cmd _ lon lat 2 UTM)# 3 . xyztotuprint(& # 39;3.xyztovtuStart & # 39)OS . system(& # 39;gmtgrdinfo & # 39+DEMgrd+& # 39;& gttmp.info & # 39)grd info = line cache . getlines(& # 39;tmp.info & # 39)OS . system(& # 39;rmtmp.info & # 39)line cache . clear cache()nrows = 0 ncols = 0 forstr _ lineingrdinfo:if(& # 39;n _ columns & # 39instr _ line):ncols = int(str _ line . split(& # 39;n _ columns:& # 39;)[-1])if(& # 39;n _ rows & # 39instr _ line):nrows = int(str _ line . split(& # 39;n _ rows:& # 39;)[-1])# loadxyzdataprint(fname+& # 39;_ UTM.xyz & # 39)data = NP . load txt(fname+& # 39;_ UTM.xyz & # 39)x = data [:,0] * scale _ coordinate = data [:,1] * scale _ coordinate = data [:,2] * scale _ coordinate DEM = data [:,3]* scale _ coordinate points = len(x)n cells =(ncols-1)_ UTM . vtu & # 39;fpout=open(vtufile,& # 39;w & # 39)FP out . write(& # 39;& ltVTKFiletype = & # 34非结构化网格& # 34;版本= & # 34;1.0″byte _ order = & # 34LittleEndian & # 34header _ type = & # 34UInt64 & # 34& gt\ n & # 39)FP out . write(& # 39;& lt非结构化网格& gt\ n & # 39)FP out . write(& # 39;& ltPieceNumberOfPoints = & # 34% .0f & # 34NumberOfCells = & # 34% .0f & # 34& gt\ n & # 39%(npoints,nCells))FP out . write(& # 39;& ltPointDataScalars = & # 34德姆& # 34;& gt\ n & # 39)FP out . write(& # 39;& ltDataArraytype = & # 34浮动64 & # 34;Name = & # 34德姆& # 34;format = & # 34ascii & # 34& gt\ n & # 39)FP out . write(& # 39;’)foriinrange(0,len(DEM)):FP out . write(& # 39;% f & # 39%(DEM[I]))FP out . write(& # 39;\ n & lt/data array & gt;\ n & # 39)FP out . write(& # 39;& lt/point data & gt;\ n & # 39)FP out . write(& # 39;& ltCellData & gt\ n & # 39)FP out . write(& # 39;& lt/cell data & gt;\ n & # 39)FP out . write(& # 39;& lt点数& gt\ n & # 39)FP out . write(& # 39;& ltDataArraytype = & # 34浮动32 & # 34;Name = & # 34积分& # 34;NumberOfComponents = & # 343″format = & # 34ascii & # 34& gt\ n & # 39)foriinrange(0,len(x)):FP out . write(& # 39;% f % f % f \ n & # 39%(x[i],y[i],z[I])FP out . write(& # 39;& lt/data array & gt;\ n & # 39)FP out . write(& # 39;& lt/Points & gt;\ n & # 39)FP out . write(& # 39;& lt单元格& gt\ n & # 39)FP out . write(& # 39;& ltDataArraytype = & # 34Int64 & # 34Name = & # 34连通性& # 34;format = & # 34ascii & # 34& gt\ n & # 39)fornrowinrange(0,nrows-1):forncolinrange(0,ncols-1):LL = ncol+nrow * ncolsfpout . write(& # 39;% . 0f % . 0f % . 0f % . 0f \ n & # 39;%(LL,LL+1,LL+1+ncols,LL+ncols))FP out . write(& # 39;& lt/data array & gt;\ n & # 39)FP out . write(& # 39;& ltDataArraytype = & # 34Int64 & # 34Name = & # 34偏移& # 34;format = & # 34ascii & # 34& gt\ n & # 39)FP out . write(& # 39;’)foriinrange(0,nCells):FP out . write(& # 39;% .0f & # 39%(I * NP _ per _ cell))FP out . write(& # 39;& lt/data array & gt;\ n & # 39)FP out . write(& # 39;& ltDataArraytype = & # 34UInt8 & # 34Name = & # 34类型& # 34;format = & # 34ascii & # 34& gt\ n & # 39)FP out . write(& # 39;’)foriinrange(0,nCells):FP out . write(& # 39;% .0f & # 39%(VTK _单元格类型))FP out . write(& # 39;& lt/data array & gt;\ n & # 39)FP out . write(& # 39;& lt/Cells & gt;\ n & # 39)FP out . write(& # 39;& lt/Piece & gt;\ n & # 39)FP out . write(& # 39;& lt/unstructured grid & gt;\ n & # 39)FP out . write(& # 39;& lt/VTK file & gt;\ n & # 39)打印(& # 39;3 . xyztotudone:& # 39;,vtu file)FP out . close()OS . system(& # 39;meshio-binary & # 39;+vtufile)所有的视频和对应的代码。观看所有密集的视频,并通过本文底部的“了解更多”按钮下载一些shell和python脚本。
本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://51itzy.com/20737.html