一:Dragon绘制实例(三维扫描的绘制)

  1. 三维扫描主要用于对物体空间外形结构以及色彩进行扫描,用以获得物体表面的空间坐标,
  2.  
  3. 他的主要意义在于能够将实物的立体信息转换为计算机能够直接处理的数据信号,为实物的数字化提供了相对方便快捷的手段,
  4.  
  5. 因此,三维扫描为工业建模,文物保存,虚拟空间构建都起到了非常重要的作用。

下载地址:http://graphics.stanford.edu/data/3Dscanrep/,页面搜索Dragon即可

提取文件

  1. import tarfile,os
  2. #读取tar压缩文件
  3. dragon_tar_file = tarfile.open("dragon_recon.tar.gz")
  4. try:
  5. os.mkdir("dragon_data")
  6. except:
  7. pass
  8.  
  9. dragon_tar_file.extractall("dragon_data")
  10. dragon_tar_file.close()

文件路径拼接

  1. import os
  2.  
  3. dragon_ply_file = os.path.join("dragon_data","dragon_recon","dragon_vrip.ply")
  1. .ply是一个很通用的三维扫描格式Polygon File Format--->也叫作Stanford Triangle Format  用来存储三维扫描结果的三维数值通过多边形面片集合来描述三维物体 分辨率极高

对.ply文件进行三维可视化

  1. import os,shutil,tarfile
  2. from mayavi import mlab
  3.  
  4. #读取tar压缩文件
  5. dragon_tar_file = tarfile.open("dragon_recon.tar.gz")
  6. try:
  7. os.mkdir("dragon_data")
  8. except:
  9. pass
  10.  
  11. dragon_tar_file.extractall("dragon_data")
  12. dragon_tar_file.close()
  13.  
  14. dragon_ply_file = os.path.join("dragon_data","dragon_recon","dragon_vrip.ply")
  15. mlab.pipeline.surface(mlab.pipeline.open(dragon_ply_file))
  16. mlab.show()
  17.  
  18. shutil.rmtree("dragon_data")

二:Canyon地形可视化实例

  1. hgt(height File Format)他是存储在航天,飞机,雷达,地形,测绘任务格式的数据文件,数据中包含空隙,数据丢失部分

下载地址:https://dds.cr.usgs.gov/srtm/version2_1/SRTM1/Region_04/(需要翻墙)

  1. import zipfile
  2. import numpy as np
  3. from mayavi import mlab
  4.  
  5. hgt = zipfile.ZipFile("N36W113.hgt.zip").read("N36W113.hgt")
  6.  
  7. #处理地形数据
  8. data = np.fromstring(hgt,">i2") #构建整数型数据,相当于2*8的16位数组
  9. data.shape = (,) #确定数组的行数和列数
  10. data = data.astype(np.float32) #使用32位浮点型
  11. data = data[:,:] #为了提高效率,我们只选取部分数据x:- y:-
  12. data[data == -] = data[data > ].min() #数据中有-32768表示为空隙数据,将该数据设置为数据中的最小值
  13.  
  14. #渲染地形hgt的数据data
  15. mlab.figure(size=(,),bgcolor=(0.16,0.28,0.46)) #获取窗口,窗口大小为400,
  16. mlab.surf(data,colormap="gist_earth",warp_scale=0.2,
  17. vmin=,vmax=)
  18.  
  19. #清空内存
  20. del data
  21. #创建交互式可视化窗口
  22. mlab.view(-5.9,,,[5.3,,]) #设置相机的视角(可选)(方位角,高度,距离和焦点等)
  23. mlab.show()

三:地球仪实例绘制

echarts世界地图各个国家及中国城市的经纬度数组

(一)数据源

  1. #城市经纬度数据
  2. cities_data = """
  3. 阿富汗,67.709953,33.93911
  4. 孟加拉国,90.356331,23.684994
  5. 津巴布韦,29.154857,-19.015438
  6. 泉州,118.58,24.93
  7. 厦门,118.1,24.46
  8. 牡丹江,129.58,44.6
  9. 绵阳,104.73,31.48
  10. 郑州,113.65,34.76
  11. 沈阳,123.38,41.8
  12. 爱尔兰,-8.24389,53.41291
  13. 乌拉圭,-55.765835,-32.522779
  14. """

(二)处理数据 ,建立索引字典和坐标列表

csv:数据分析与展示---Numpy数据存取与函数

  1. #建立城市-城索引的字典,城市经纬度的列表
  2. import csv
  3. cities = dict()
  4. coords = list()
  5. for line in list(csv.reader(cities_data.split("\n")))[:-]: #:-1排除第一行只有一个\n
  6. name,long_,lat = line
  7. cities[name] = len(coords) #建立索引,len会随着coords增加而增加,这就是索引,我们根据这个去查找列表,更快
  8. coords.append((float(long_),float(lat)))

(三)进行坐标转换(在三维空间中实际是按照x,y,z三个轴来表示的,而地球数据是按照经纬度表示,需要将经纬度二维转三维坐标)

  1. #坐标转换
  2. coords = np.array(coords)
  3. lat, long = coords.T*np.pi/ #进行转置
  4. x = np.cos(long)*np.cos(lat)
  5. y = np.cos(long)*np.sin(lat)
  6. z = np.sin(long)

(四)地球绘制部分

(1)建立窗口

  1. #绘制窗口
  2. mlab.figure(size=(,),bgcolor=(0.48,0.48,0.48))
  3.  
  4. ........
  5.  
  6. mlab.view(,,,[-0.05,,]) #设置相机的视角(可选)(方位角,高度,距离和焦点等)
  7. mlab.show()

(2)绘制地球

  1. #绘制球体mesh也可以,不过效果不好
  2. sphere = mlab.points3d( #绘制半透明球体,表示地球外表面
  3. ,,,
  4. scale_factor=,
  5. color=(0.67,0.77,0.93),
  6. resolution = ,
  7. opacity = 0.7,
  8. name = "Earth"
  9. )

优化(放在后面,在show前面,对整体绩效镜面处理)

  1. #上面效果不是太好,添加镜面反射等参数
  2. #调整镜面反射参数
  3. sphere.actor.property.specular = 0.45
  4. sphere.actor.property.specular_power =
  5. #设置背面剔除,以更好的显示透明效果
  6. sphere.actor.property.backface_culling = True

(3)在地球相应位置绘制城市名称(一个点)

  1. #绘制城市名称
  2. points = mlab.points3d(x,y,z, #已设置过的三维坐标
  3. scale_mode="none", #放缩模式,标量,矢量,无
  4. scale_factor=0.03, #放缩比例
  5. color=(,,))

(4)在相应位置绘制城市名称(mlab.text(x,y,z,text,...)),中文有问题,注意数据选取均匀

  1. #绘制城市名字
  2. for city,index in cities.items():
  3. label = mlab.text(x[index],y[index],city,z=z[index], #x,y,city是城市名称,z坐标,width是文本宽度,name表示文本对象
  4. width=0.016*len(city),name=city)
  5. label.property.shadow = True

(5)绘制大洲的边界

  1. 大洲的边界是一个不规则图形,很难提供直接的数据,不过vtk给我们提供了多边形数据源,叫做BuiltinSurface,其中就含有地球大洲边界现象

  1. #绘制地球上大洲的边界
  2. from mayavi.sources.builtin_surface import BuiltinSurface
  3. #使用mlab的管线绘制表面函数对边界进行绘制
  4. continents_src = BuiltinSurface(source="earth",name="Continents")
  5. continents = mlab.pipeline.surface(continents_src,color=(,,))

优化:LOD实现近细远粗

  1. #绘制地球上大洲的边界
  2. from mayavi.sources.builtin_surface import BuiltinSurface
  3. #使用mlab的管线绘制表面函数对边界进行绘制
  4. continents_src = BuiltinSurface(source="earth",name="Continents")
  5. #设置模型LOD的层级,实现近细远粗
  6. continents_src.data_source.on_ratio = 2 #2级lod
  7. continents = mlab.pipeline.surface(continents_src,color=(,,))

(6)绘制赤道线

  1. #赤道线numpy数组的构造过程
  2. theta = np.linspace(,*np.pi,)  #由很多小直线组成
  3. x = np.cos(theta)
  4. y = np.sin(theta)
  5. z = np.zeros_like(theta)
  6. #绘制赤道线
  7. mlab.plot3d(x,y,z,color=(,,),
  8. opacity=0.2,tube_radius=None)

(五)全部代码

  1. import numpy as np
  2. from mayavi import mlab
  3.  
  4. #城市经纬度数据
  5. cities_data = """
  6. Hong Kong,114.109497,114.109497
  7. Miami,-80.19179,-80.19179
  8. Manila,120.984219,120.984219
  9. Caracas,-66.903606,-66.903606
  10. Nicosia,33.382276,33.382276
  11. Luxembourg,6.129583,6.129583
  12. Mexico City,-99.133208,-99.133208
  13. Doha,51.53104,51.53104
  14. Prague,14.4378,14.4378
  15. Delhi,77.209021,77.209021
  16. Taipei,121.565418,121.565418
  17. Tel Aviv,34.781768,34.781768
  18. São Paulo,-46.633309,-46.633309
  19. Oslo,10.752245,10.752245
  20. Milan,9.185924,9.185924
  21. Toronto,-79.383184,-79.383184
  22. Helsinki,24.938379,24.938379
  23. Chicago,-87.629798,-87.629798
  24. Tokyo,139.691706,139.691706
  25. Paris,2.352222,2.352222
  26. Kuala Lumpur,101.686855,101.686855
  27. Manama,50.58605,50.58605
  28. Lyon,4.835659,4.835659
  29. Madrid,-3.70379,-3.70379
  30. Tallinn,24.753575,24.753575
  31. Bucharest,26.102538,26.102538
  32. Montreal,-73.567256,-73.567256
  33. Riga,24.105186,24.105186
  34. Istanbul,28.978359,28.978359
  35. New York,-74.005941,-74.005941
  36. Vilnius,25.279651,25.279651
  37. Moscow,37.6173,37.6173
  38. """
  39.  
  40. #1.建立城市-城索引的字典,城市经纬度的列表
  41. import csv
  42. cities = dict()
  43. coords = list()
  44. for line in list(csv.reader(cities_data.split("\n")))[:-]: #:-1排除第一行只有一个\n
  45. name,long_,lat = line
  46. cities[name] = len(coords) #建立索引,len会随着coords增加而增加,这就是索引,我们根据这个去查找列表,更快
  47. coords.append((float(long_),float(lat)))
  48.  
  49. #2.坐标转换
  50. coords = np.array(coords)
  51. lat, long = coords.T*np.pi/ #进行转置
  52. x = np.cos(long)*np.cos(lat)
  53. y = np.cos(long)*np.sin(lat)
  54. z = np.sin(long)
  55.  
  56. #3.绘制窗口
  57. mlab.figure(size=(,),bgcolor=(0.48,0.48,0.48))
  58.  
  59. #4.绘制球体mesh也可以,不过效果不好
  60. sphere = mlab.points3d( #绘制半透明球体,表示地球外表面
  61. ,,,
  62. scale_factor=,
  63. color=(0.67,0.77,0.93),
  64. resolution = ,
  65. opacity = 0.7,
  66. name = "Earth"
  67. )
  68.  
  69. #5.绘制城市名称
  70. points = mlab.points3d(x,y,z, #已设置过的三维坐标
  71. scale_mode="none", #放缩模式,标量,矢量,无
  72. scale_factor=0.03, #放缩比例
  73. color=(,,))
  74.  
  75. #6.绘制城市名字
  76. for city,index in cities.items():
  77. label = mlab.text(x[index],y[index],city,z=z[index], #x,y,city是城市名称,z坐标,width是文本宽度,name表示文本对象
  78. width=0.016*len(city),name=city)
  79. label.property.shadow = True
  80.  
  81. #7.绘制地球上大洲的边界
  82. from mayavi.sources.builtin_surface import BuiltinSurface
  83. #使用mlab的管线绘制表面函数对边界进行绘制
  84. continents_src = BuiltinSurface(source="earth",name="Continents")
  85. #8.设置模型LOD的层级,实现近细远粗
  86. continents_src.data_source.on_ratio = #2级lod
  87. continents = mlab.pipeline.surface(continents_src,color=(,,))
  88.  
  89. #9.赤道线numpy数组的构造过程
  90. theta = np.linspace(,*np.pi,)
  91. x = np.cos(theta)
  92. y = np.sin(theta)
  93. z = np.zeros_like(theta)
  94. #10.绘制赤道线
  95. mlab.plot3d(x,y,z,color=(,,),
  96. opacity=0.2,tube_radius=None)
  97.  
  98. #11.上面效果不是太好,添加镜面反射等参数
  99. #调整镜面反射参数
  100. sphere.actor.property.specular = 0.45
  101. sphere.actor.property.specular_power =
  102. #设置避免剔除,以更好的显示透明效果
  103. sphere.actor.property.backface_culling = True
  104.  
  105. mlab.view(,,,[-0.05,,]) #设置相机的视角(可选)(方位角,高度,距离和焦点等)
  106. mlab.show()

科学计算三维可视化---Mayavi可视化实例的更多相关文章

  1. 科学计算三维可视化---Mlab基础(数据可视化)

    推文:科学计算三维可视化---TVTK库可视化实例 使用相关函数:科学计算三维可视化---Mlab基础(管线控制函数) 一:mlab.pipeline中标量数据可视化 通过持续实例,来感受mlab对数 ...

  2. Python科学计算三维可视化(整理完结)

    中国MOOC<Pyhton计算计算三维可视化>总结 课程url:here ,教师:黄天宇,嵩天 下文的图片和问题,答案都是从eclipse和上完课后总结的,转载请声明. Python数据三 ...

  3. 科学计算三维可视化---Mlab基础(管线控制函数)

    科学计算三维可视化---TVTK管线与数据加载(可视化管线和图像管线了解) 科学计算三维可视化---Mayavi入门(Mayavi管线) Mlab管线控制函数的调用 Sources:数据源 Filte ...

  4. 科学计算三维可视化---Mlab基础(鼠标选取交互操作)

    一:鼠标选取介绍 二:选取红色小球分析 相关方法:科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数) 1.小球场景初始化建立 import numpy as np from maya ...

  5. 科学计算三维可视化---Traits介绍

    简介 Traits是开源扩展库,Traits本身与科学计算可视化没有直接关联,但他其实TVTK,Mayavi,TraitsUI基础 安装: pip3 install traits--cp36-cp36 ...

  6. 科学计算三维可视化---TraitsUI的介绍

    TraitsUI的介绍 Python中存在Tkinter,wxPython,pyQt4等GUI图像界面编写库,这三类库要求程序员掌握众多的GUI API函数 对于科学计算的应用来说,我们希望可以快速的 ...

  7. 科学计算三维可视化---Mayavi入门(Mayavi库的基本元素和绘图实例)

    一:Mayavi库的基本元素 .处理图形可视化和图形操作的mlab模块 .操作管线对象,窗口对象的api (一)mlab模块 (二)mayavi的api 二:快速绘图实例 (一)mlab.mesh的使 ...

  8. 科学计算三维可视化---TraitsUI与Mayavi实例

    TraitsUI与Mayavi实例 一:创建一个简单的TraitsUI与Mayavi实例 from numpy import sqrt,sin,mgrid from traits.api import ...

  9. 科学计算三维可视化---Mayavi入门(Mayavi管线)

    一:Mayavi管线 mlab.show_pipeline() #显示管线层级,来打开管线对话框 (一)管线中的对象scene Mayavi Scene:处于树的最顶层的对象,他表示场景,配置界面中可 ...

随机推荐

  1. 20162325 金立清 S2 W3 C13

    20162325 2017-2018-2 <程序设计与数据结构>第3周学习总结 教材学习内容概要 查找是在一组项内找到指定目标或是确定目标不存在的过程 高效的查找使得比较的次数最少 Com ...

  2. Task 6.2冲刺会议四 /2015-5-17

    今天主要是学习并熟悉了C#的开发流程,把他的文件的大体结构和每个组件之间的联系弄清楚之后.开始写服务器部分的内容.学习过程中,感觉网上的资料有些太鱼龙混杂了,不知道该怎么取舍.明天准备完善服务器的功能 ...

  3. 【CS231N】2、多类SVM

    一.疑问 1. assignments1 linear_svm.py文件的函数 svm_loss_naive中,使用循环的方式实现梯度计算 linear_svm.py文件的函数 svm_loss_ve ...

  4. tomcat启动问题排查

    遇到tomcat错误时不一定是tomcat的配置问题,还有可能是项目的配置问题.检查下xml的servlet配置是不是出了问题. tomcat8.0使用注解的方式帮我注册了servlet了,这时候已经 ...

  5. java下Mysql基本操作

    https://www.cnblogs.com/centor/p/6142775.html

  6. maven导入项目时出现“Cannot read lifecycle mapping metadata …… invalid END header (bad central directory offset)pom”错误的解决方法

    出现该错误是因为jar包版本不匹配,比如linux上的jar包导入到windows上了.可以将.m2\repository的org.apache.maven.plugins删掉然后让maven重新下载 ...

  7. Centos7 Zookeeper 集群安装

    1:安装java 环境 -openjdk* 2:zookeeper 安装 (官网 http://www.apache.org/dyn/closer.cgi/zookeeper/) 2.1 目录创建 自 ...

  8. [转帖]2018年JVM生态系统报告出炉

    很多未解之谜终于有答案了——2018年JVM生态系统报告出炉 https://blog.csdn.net/hollis_chuang/article/details/84134298   2018年1 ...

  9. poj 1185(状态压缩DP)

    poj  1185(状态压缩DP) 题意:在一个N*M的矩阵中,‘H'表示不能放大炮,’P'表示可以放大炮,大炮能攻击到沿横向左右各两格,沿纵向上下各两格,现在要放尽可能多的大炮使得,大炮之间不能相互 ...

  10. Java多线程之ThreadLocal总结

    原贴地址:http://www.cnblogs.com/zhengbin/p/5674638.html 阅读目录 官方对ThreadLocal的描述: <Thinking in Java> ...