一:鼠标选取介绍

二:选取红色小球分析

相关方法:科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数)

1.小球场景初始化建立

  1. import numpy as np
  2. from mayavi import mlab
  3.  
  4. # 用mlab.points3d建立红色和白色小球的集合
  5. x1, y1, z1 = np.random.random((,)) #3行10列分给三个元素,每个都是以为数组含10元素
  6. red_glyphs = mlab.points3d(x1,y1,z1,color=(,,),resolution=) #创建10个红球,位置为x1,y1,z1,分辨率为10的小球
  7.  
  8. x2, y2, z2 = np.random.random((,)) #3行10列分给三个元素,每个都是以为数组含10元素
  9. white_glyphs = mlab.points3d(x2,y2,z2,color=(0.9,0.9,0.9),resolution=) #创建10个白球

2.选取框初始化建立outline方法是mlab绘制选取框

  1. outline = mlab.outline(line_width=)  #outline即在某个物体的外围设置一个外框
  2. outline.outline_mode = "cornered"
  3. outline.bounds = (x1[]-0.1,x1[]+0.1,  #对x1,y1,z1为0处选取红色小球第一个
  4. y1[]-0.1,y1[]+0.1,
  5. z1[]-0.1,z1[]+0.1,
  6. )

3.选取回调函数的结构

  1. >>> red_glyphs.actor
  2. <mayavi.components.actor.Actor object at 0x000000001370EEB8>
  3. >>> red_glyphs.actor.actors
  4. [<tvtk.tvtk_classes.actor.Actor object at 0x000000001459D0F8>]  #我们需要的是vtk actor集合

计算哪个小球被选取,

  1. 一个小球有好多个顶点构成,设置了小球的分辨率为10,在Mayaviresolution10的小球中相当于有82个顶点组成的一个小球,一共10个红色小球,所以场景中共有820个对应顶点,我们需要找到鼠标求解的顶点是在这820个中的哪一个,例如第100则是第二个小球
  1. #获取一个红色小球的所有顶点,我们只是想要知道每个小球的顶点数目而已,所以不用考虑其他
  2. glyph_points = red_glyphs.glyph.glyph_source.glyph_source.output.points.to_array()
  3.  
  4. #.选取回调函数的结构
  5. def piker_callback(picker): #当鼠标点击会返回一个vtk picker对象,我们将对该对象进行处理判断
  6. if picker.actor in red_glyphs.actor.actors:
  7. # 确定该小球的ID,
  8. point_id = int(picker.point_id/glyph_points.shape[]) #picker.point_id是picker对象选取的顶点ID,glyph_points.shape[0]记录了82这个值,通过这个计算出小球的ID
  9. if point_id != -: #表示有红色小球被选取了
  10. #计算与此红色小球相关的坐标
  11. x,y,z = x1[point_id],y1[point_id],z1[point_id]
  12. #将外框移动到小球上
  13. outline.bounds = (
  14. x - 0.1, x + 0.1,
  15. y - 0.1, y + 0.1,
  16. z - 0.1, z + 0.1,
  17. )

4.建立响应机制

  1. figure = mlab.gcf() #获取当前窗口指针
  2. picker = figure.on_mouse_pick(piker_callback)
  3. mlab.title("Click on red balls") #设置窗口的标题文字
  4.  
  5. mlab.show()

5.全部代码

  1. import numpy as np
  2. from mayavi import mlab
  3.  
  4. #.小球场景初始化建立
  5. # 用mlab.points3d建立红色和白色小球的集合
  6. x1, y1, z1 = np.random.random((,)) #3行10列分给三个元素,每个都是以为数组含10元素
  7. red_glyphs = mlab.points3d(x1,y1,z1,color=(,,),resolution=) #创建10个红球,位置为x1,y1,z1,分辨率为10的小球
  8.  
  9. x2, y2, z2 = np.random.random((,)) #3行10列分给三个元素,每个都是以为数组含10元素
  10. white_glyphs = mlab.points3d(x2,y2,z2,color=(0.9,0.9,0.9),resolution=) #创建10个白球
  11.  
  12. # .选取框初始化建立
  13. outline = mlab.outline(line_width=)
  14. outline.outline_mode = "cornered"
  15. outline.bounds = (x1[]-0.1,x1[]+0.1,
  16. y1[]-0.1,y1[]+0.1,
  17. z1[]-0.1,z1[]+0.1,
  18. )
  19.  
  20. #获取一个红色小球的所有顶点,我们只是想要知道每个小球的顶点数目而已,所以不用考虑其他
  21. glyph_points = red_glyphs.glyph.glyph_source.glyph_source.output.points.to_array()
  22.  
  23. #.选取回调函数的结构
  24. def piker_callback(picker): #当鼠标点击会返回一个vtk picker对象,我们将对该对象进行处理判断
  25. if picker.actor in red_glyphs.actor.actors:
  26. # 确定该小球的ID,
  27. point_id = int(picker.point_id/glyph_points.shape[]) #picker.point_id是picker对象选取的顶点ID,glyph_points.shape[]记录了82这个值,通过这个计算出小球的ID
  28. if point_id != -: #表示有红色小球被选取了
  29. #计算与此红色小球相关的坐标
  30. x,y,z = x1[point_id],y1[point_id],z1[point_id]
  31. #将外框移动到小球上
  32. outline.bounds = (
  33. x - 0.1, x + 0.1,
  34. y - 0.1, y + 0.1,
  35. z - 0.1, z + 0.1,
  36. )
  37.  
  38. figure = mlab.gcf() #获取当前窗口指针
  39. picker = figure.on_mouse_pick(piker_callback)
  40. mlab.title("Click on red balls") #设置窗口的标题文字
  41.  
  42. mlab.show()

6.优化

两个问题

  1. .小球初始速度太慢
  2. .鼠标选取不精确

  1. import numpy as np
  2. from mayavi import mlab
  3.  
  4. figure = mlab.gcf() #获取当前窗口指针
  5.  
  6. figure.scene.disable_render = True
  7. #.小球场景初始化建立
  8. # 用mlab.points3d建立红色和白色小球的集合
  9. x1, y1, z1 = np.random.random((,)) #3行10列分给三个元素,每个都是以为数组含10元素
  10. red_glyphs = mlab.points3d(x1,y1,z1,color=(,,),resolution=) #创建10个红球,位置为x1,y1,z1,分辨率为10的小球
  11.  
  12. x2, y2, z2 = np.random.random((,)) #3行10列分给三个元素,每个都是以为数组含10元素
  13. white_glyphs = mlab.points3d(x2,y2,z2,color=(0.9,0.9,0.9),resolution=) #创建10个白球
  14.  
  15. # .选取框初始化建立
  16. outline = mlab.outline(line_width=)
  17. outline.outline_mode = "cornered"
  18. outline.bounds = (x1[]-0.1,x1[]+0.1,
  19. y1[]-0.1,y1[]+0.1,
  20. z1[]-0.1,z1[]+0.1,
  21. )
  22.  
  23. figure.scene.disable_render = False
  24.  
  25. #获取一个红色小球的所有顶点,我们只是想要知道每个小球的顶点数目而已,所以不用考虑其他
  26. glyph_points = red_glyphs.glyph.glyph_source.glyph_source.output.points.to_array()
  27.  
  28. #.选取回调函数的结构
  29. def piker_callback(picker): #当鼠标点击会返回一个vtk picker对象,我们将对该对象进行处理判断
  30. if picker.actor in red_glyphs.actor.actors:
  31. # 确定该小球的ID,
  32. point_id = int(picker.point_id/glyph_points.shape[]) #picker.point_id是picker对象选取的顶点ID,glyph_points.shape[]记录了82这个值,通过这个计算出小球的ID
  33. if point_id != -: #表示有红色小球被选取了
  34. #计算与此红色小球相关的坐标
  35. x,y,z = x1[point_id],y1[point_id],z1[point_id]
  36. #将外框移动到小球上
  37. outline.bounds = (
  38. x - 0.1, x + 0.1,
  39. y - 0.1, y + 0.1,
  40. z - 0.1, z + 0.1,
  41. )
  42.  
  43. picker = figure.on_mouse_pick(piker_callback)
  44. picker.tolerance = 0.01 #设置tolerance参数提高精确度
  45.  
  46. mlab.title("Click on red balls") #设置窗口的标题文字
  47.  
  48. mlab.show()

科学计算三维可视化---Mlab基础(鼠标选取交互操作)的更多相关文章

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

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

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

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

  3. 科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数)

    Mlab了解 Mlab是Mayavi提供的面向脚本的api,他可以实现快速的三维可视化,Mayavi可以通过Mlab的绘图函数对Numpy数组建立可视化. 过程为: .建立数据源 .使用Filter( ...

  4. 科学计算三维可视化---Mlab基础(改变物体的外观颜色)

    import numpy as np from mayavi import mlab #建立数据 x,y = np.mgrid[-::200j,-::200j] z = *np.sin(x*y)/(x ...

  5. 科学计算三维可视化---Mlab基础(常用控制函数)

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

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

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

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

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

    一:Dragon绘制实例(三维扫描的绘制) 三维扫描主要用于对物体空间外形结构以及色彩进行扫描,用以获得物体表面的空间坐标, 他的主要意义在于能够将实物的立体信息转换为计算机能够直接处理的数据信号,为 ...

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

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

随机推荐

  1. CS小分队第二阶段冲刺站立会议(5月31日)

    昨日成果:查找相关C#资料,清楚一些bug 遇到问题:系统获取的图标分辨率太低,网上找来的获取图标的代码看不太懂 今日计划:完善获取文件图标功能,并且能够删除获取的图标文件

  2. 现代软件工程构建之法 前五章阅读感想&困惑

    第一章 第一节 新时代中国的IT产业市场规则不规范,书中提到社会上有个别软件公司的软件一定要卸载别家公司的软件才能运行,我这里感到疑惑---————是不是说如果 一间软件公司他能做出一个像微软操作系统 ...

  3. 二路归并排序java实现

    二路归并排序:其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题.即所谓“分而治之,万流归一” 二路归 ...

  4. mac下搭建MySql环境

    准备工作做完后,开始: 创建数据库 step1: 在mac中->系统偏好设置->最下边点MySQL 在弹出页面中 关闭mysql服务(点击stop mysql server) step2: ...

  5. 1105 C程序的推导过程

  6. Beta阶段DAY2

    一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:删除多余按钮,调整界面. 林庭亦:删除麻烦的颜色设置. 郑子熙:添加新增按钮. 陈文俊:重新规划面板及功能. ...

  7. Delphi中使用OLE方法操作Excel

    首先创建 Excel 对象,使用ComObj: var ExcelApp: Variant; ExcelApp := CreateOleObject( ′Excel.Application′ ); 注 ...

  8. vue 引入组件

    <comA></comA>此时可用在模板里 //a为vue文件,里面定义了模板import comA from './components/a' export default ...

  9. Graph And Its Complement CodeForces - 990D(思维构造)

    题意: 图中有n个点,开始有a个连通块,然后连着的边断开,不连的边连上,变为b个连通块,输出原图的邻接矩阵. 解析: 原图中连通块大于1的图,经过上述操作后,一定变成只有1个连通块的图. 若n != ...

  10. Trailing Zeroes (II) LightOJ - 1090(预处理+前缀和)

    求C(n,r)*p^q的后缀零 考虑一下 是不是就是求 10^k*m  的k的最大值 而10又是由2 和 5 组成  所以即是求 2^k1 * 5^k2 * m1 中k1和k2小的那一个数 短板效应嘛 ...