当前位置: 首页 > news >正文

VTK地自定义8个点绘制立方体

点击打开链接http://blog.163.com/god_sun/blog/static/56399926201110108481537/


java代码:

import vtk.vtkActor;
import vtk.vtkCamera;
import vtk.vtkCellArray;
import vtk.vtkExtractEdges;
import vtk.vtkFloatArray;
import vtk.vtkInteractorStyleTrackballActor;
import vtk.vtkPoints;
import vtk.vtkPolyData;
import vtk.vtkPolyDataMapper;
import vtk.vtkRenderWindow;
import vtk.vtkRenderWindowInteractor;
import vtk.vtkRenderer; 
import vtk.* ;  

//Then we define our class.  
public class Lifangti { 
	
	  static {
	        if (!vtkNativeLibrary.LoadAllNativeLibraries()) {
	          for (vtkNativeLibrary lib : vtkNativeLibrary.values()) {
	            if (!lib.IsLoaded()) {
	              System.out.println(lib.GetLibraryName() + " not loaded");
	            }
	          }
	        }
	        vtkNativeLibrary.DisableOutputWindow(null);
	      }

	  
	  
	  
	  public static void makeLifangti(){
		  int i ;
		  //可以看到图中有27个小正方体组成了一个大的正方体
		  //x[8][3],就是每一个小正方体的 8个点的x,y,z值
		  //java float类型后面需加上f 表示float类型数据
		  //float[][] x= {{0,0,0},{0.3f,0,0},{0.3f,0.3f,0},{0,0.3f,0}, {0,0,0.3f},{0.3f,0,0.3f},{0.3f,0.3f,0.3f},{0,0.3f,0.3f}};
		  
		  double[][]  x={{0,0,0},{0.3,0,0},{0.3,0.3,0},{0,0.3,0},
			       {0,0,0.3},{0.3,0,0.3},{0.3,0.3,0.3},{0,0.3,0.3}};
		  //这个查阅VTK文档发现解释的跟我理解的不一样。。。很有可能是我看不懂。。。
		  //我的理解是 这样的, 一个正方体 是由 6个面组成,我们程序也正是打算以面位最小的CELL 来组成我们要的正方体
		  //当然,我们也可以用线来画,那样只能画出正方体的边框,就不能用下面用到的PolyData,而要用vtkLine这个对象作为CELL
		  //既然选定了 由面来组成,那就产生了六个面,第一个面 是由上面定义的8个点的 0,1,2,3四个点组成,以下以此类推。
		  //特别注意的是,这里的0,1,2,3 这几个点,并不是对应的 x[8][3],这里的第0,1,2,3具体为什么下面会说。
		  //每个数代表点数据的索引下标
		  int[][] pts= {{0,1,2,3},{4,5,6,7},{0,1,5,4}, {1,2,6,5},{2,3,7,6},{3,0,4,7}};
		  //concrete dataset represents vertices, lines, polygons, and triangle strips,   这是文档里的描述,已经比较清楚了。
		  vtkPolyData  cube =new vtkPolyData();
		  //这个用来保存,我们所说的 点之间的拓扑结构,因为根据VTK的流程 ,我们必须这么做,一步步打包。
		  vtkCellArray  polys =new vtkCellArray();
		  //这个是关于颜色的属性值,在这里不做重点介绍。
		  vtkFloatArray  scalars =new vtkFloatArray();
		  //还是同样的道理,因为我们是用自己定义的点,不是用VTK里面的 vtksphere,vtkcone等 source,所以必须把点放到vtkPoints里
		  vtkPoints  points =new vtkPoints();
		  //把我们定义好的点,放到points里,这里的i 才是真正的索引,如果我们的循环从i=8开始
		  //真正的点的索引,以及cell中引用的,将会跟这个索引一致
		  for (i=0;i<8;i++) points.InsertPoint(i, x[i]);
		  //插入点的拓扑结构,
		 //2011年11月10日 - god_sun - 随枫¤心慧

		  //第一个参数 虽然是vtkIdType类型的,但事实上也是一个int型的,文档里的解释第一个参数是 点的个数,第二个是点的内容。
		 //设置单元由几个点组成,每个单元指定对应的点
		  for (i=0;i<6;i++)
		  {
			   polys.InsertNextCell(4);
			   for(int j=0;j<4;j++){
				   polys.InsertCellPoint(pts[i][j]);
			   }
		  }
		  for (i=0;i<8;i++) scalars.InsertTuple1(i,i);
		  //接下来就开始了VTK的pipeline流程。
		  cube.SetPoints(points);
		  cube.SetPolys(polys);
		         cube.GetPointData().SetScalars(scalars);

		  这段代码是为了显示立方体周围的边框。。。但是设置visibilityOn 或者visibilityOff看起来不是非常明显。
		  //以前photoshop的时候画一个立方体,会在周围再画上边框,这样会感觉更饱满一些。。。
		  //vtk5之后使用SetInputData(cube);之前格式为SetInput(cube)
		  vtkExtractEdges  extract=new vtkExtractEdges();
		         extract.SetInputData(cube);
		  vtkPolyDataMapper  mapEdges=new vtkPolyDataMapper();
		         mapEdges.SetInputConnection(extract.GetOutputPort());
		   mapEdges.SetScalarVisibility(0);
		  vtkActor  edgeActor=new vtkActor();
		         edgeActor.SetMapper(mapEdges);
		   edgeActor.VisibilityOn();
		  

		  vtkPolyDataMapper  cubeMapper =new  vtkPolyDataMapper();
		  cubeMapper.SetInputData(cube);
		  cubeMapper.SetScalarRange(0,7);
		  int No=0;
		  //p,j,k是为了设置立方体的不同位置。
		  float p=0.0f,j=0.0f,k=0.0f;
		  vtkRenderer  renderer =new  vtkRenderer();
		  for (p=0.0f;p<0.9;p=p+0.3f)
		  {
		   for (j=0.0f;j<0.9;j=j+0.3f)
		   {
		    for(k=0.0f;k<0.9;k=k+0.3f)
		    {
		     vtkActor  cubeActor =new vtkActor();
		     //设置ACTOR的不同位置,来显示最终的图形。
		     cubeActor.SetPosition(p,j,k);
		     vtkActor  tempactor =new vtkActor ();
		     cubeActor.SetMapper(cubeMapper);
		     renderer.AddActor(cubeActor);
		    }
		   }
		  }
		  
		  vtkCamera  camera =new vtkCamera();
		  camera.SetPosition(1,1,1);
		  camera.SetFocalPoint(0,0,0);
		  
		  
		  vtkRenderWindow  reWin = new vtkRenderWindow();
		  reWin.AddRenderer(renderer);

		  vtkRenderWindowInteractor  iren =new  vtkRenderWindowInteractor();
		  iren.SetRenderWindow(reWin);
		  //如果去掉这个style那么,交互的时候,整个立方体会一起转动
		  //如果加上,则是每个立方体单独转动
		  vtkInteractorStyleTrackballActor  style =new  vtkInteractorStyleTrackballActor();
		  iren.SetInteractorStyle(style); 
		   
		  renderer.SetActiveCamera(camera);
		   renderer.ResetCamera();
		   renderer.SetBackground(0,1,1);

		  reWin.SetSize(300,300);

		  reWin.Render();
		  iren.Initialize();
		  iren.Start();

	  }
	  
	  
	  public static void main(String[] args) {
			// TODO Auto-generated method stub
		  makeLifangti();
		}
 
 
}  


c++代码如下:

#include <vtkActor.h>
#include <vtkCamera.h>
#include <vtkCellArray.h>
#include <vtkFloatArray.h>
#include <vtkPointData.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkInteractorStyleTrackballActor.h>
#include <vtkExtractEdges.h>
typedef vtkActorCollection* vtkActorCollection_Array;
int main()
{
 int i ;
 //可以看到图中有27个小正方体组成了一个大的正方体
       //x[8][3],就是每一个小正方体的 8个点的x,y,z值
 float x[8][3]={{0,0,0},{0.3,0,0},{0.3,0.3,0},{0,0.3,0},
       {0,0,0.3},{0.3,0,0.3},{0.3,0.3,0.3},{0,0.3,0.3}};
 //这个查阅VTK文档发现解释的跟我理解的不一样。。。很有可能是我看不懂。。。
 //我的理解是 这样的, 一个正方体 是由 6个面组成,我们程序也正是打算以面位最小的CELL 来组成我们要的正方体
 //当然,我们也可以用线来画,那样只能画出正方体的边框,就不能用下面用到的PolyData,而要用vtkLine这个对象作为CELL
 //既然选定了 由面来组成,那就产生了六个面,第一个面 是由上面定义的8个点的 0,1,2,3四个点组成,以下以此类推。
 //特别注意的是,这里的0,1,2,3 这几个点,并不是对应的 x[8][3],这里的第0,1,2,3具体为什么下面会说。
 vtkIdType pts[6][4]={{0,1,2,3},{4,5,6,7},{0,1,5,4},
        {1,2,6,5},{2,3,7,6},{3,0,4,7}};
 //concrete dataset represents vertices, lines, polygons, and triangle strips,   这是文档里的描述,已经比较清楚了。
 vtkPolyData *cube = vtkPolyData::New();
 //这个用来保存,我们所说的 点之间的拓扑结构,因为根据VTK的流程 ,我们必须这么做,一步步打包。
 vtkCellArray *polys = vtkCellArray::New();
 //这个是关于颜色的属性值,在这里不做重点介绍。
 vtkFloatArray *scalars = vtkFloatArray::New();
 //还是同样的道理,因为我们是用自己定义的点,不是用VTK里面的 vtksphere,vtkcone等 source,所以必须把点放到vtkPoints里
 vtkPoints *points = vtkPoints::New();
 //把我们定义好的点,放到points里,这里的i 才是真正的索引,如果我们的循环从i=8开始
 //真正的点的索引,以及cell中引用的,将会跟这个索引一致
 for (i=0;i<8;i++)points->InsertPoint(i,x[i]);
 //插入点的拓扑结构,
2011年11月10日 - god_sun - 随枫¤心慧

 //第一个参数 虽然是vtkIdType类型的,但事实上也是一个int型的,文档里的解释第一个参数是 点的个数,第二个是点的内容。
 for (i=0;i<6;i++) polys->InsertNextCell(4,pts[i]);
 for (i=0;i<8;i++) scalars->InsertTuple1(i,i);
 //接下来就开始了VTK的pipeline流程。
 cube->SetPoints(points);
 cube->SetPolys(polys);
        cube->GetPointData()->SetScalars(scalars);

 这段代码是为了显示立方体周围的边框。。。但是设置visibilityOn 或者visibilityOff看起来不是非常明显。
 //以前photoshop的时候画一个立方体,会在周围再画上边框,这样会感觉更饱满一些。。。
 vtkExtractEdges *extract=vtkExtractEdges::New();
        extract->SetInput(cube);
 vtkPolyDataMapper *mapEdges=vtkPolyDataMapper::New();
        mapEdges->SetInputConnection(extract->GetOutputPort());
  mapEdges->SetScalarVisibility(0);
 vtkActor *edgeActor=vtkActor::New();
        edgeActor->SetMapper(mapEdges);
  edgeActor->VisibilityOn();
 

 vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
 cubeMapper->SetInput(cube);
 cubeMapper->SetScalarRange(0,7);
 int No=0;
 //p,j,k是为了设置立方体的不同位置。
 float p=0.0,j=0.0,k=0.0;
 vtkRenderer *renderer = vtkRenderer::New();
 for (p=0.0;p<0.9;p=p+0.3)
 {
  for (j=0.0;j<0.9;j=j+0.3)
  {
   for(k=0.0;k<0.9;k=k+0.3)
   {
    vtkActor *cubeActor = vtkActor::New();
    //设置ACTOR的不同位置,来显示最终的图形。
    cubeActor->SetPosition(p,j,k);
    vtkActor *tempactor = vtkActor ::New();
    cubeActor->SetMapper(cubeMapper);
    renderer->AddActor(cubeActor);
   }
  }
 }
 
 vtkCamera *camera =vtkCamera::New();
 camera->SetPosition(1,1,1);
 camera->SetFocalPoint(0,0,0);
 
 
 vtkRenderWindow *reWin = vtkRenderWindow::New();
 reWin->AddRenderer(renderer);

 vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
 iren->SetRenderWindow(reWin);
 //如果去掉这个style那么,交互的时候,整个立方体会一起转动
 //如果加上,则是每个立方体单独转动
 vtkInteractorStyleTrackballActor *style = vtkInteractorStyleTrackballActor::New();
 iren->SetInteractorStyle(style); 
  
 renderer->SetActiveCamera(camera);
  renderer->ResetCamera();
  renderer->SetBackground(0,1,1);

 reWin->SetSize(300,300);

 reWin->Render();
 iren->Initialize();
 iren->Start();

 points->Delete();
 cube->Delete();
 cubeMapper->Delete();
 renderer->Delete();
 reWin->Delete();
 iren->Delete();
 polys->Delete();
  scalars->Delete();
 return 0;
}

如何使用 自己定义好的点,来画图 
自己定义的点插入到 vtkpoints中
定义好的拓扑结构插入到 vtkcellarray中 无非就是这种方式。


绘制上图的思路:

8个点定义一个立方体的8个顶点;

每4个点组成一个面,总共6个面;

8个点插入到VTKpoints中;

6个面插入到拓扑结构中VTKcellarray中;

组装好一个立方体,然后平移这个立方体9次,即可形成最终的一个大立方体;

每个小立方体可单独旋转;




相关文章:

  • VTKDemo:绘制线段、立方体、多条线段、管线:
  • 科学计算可视化相关包安装教程:vtk, numpy, traits, mayavi, pyqt,pyKriging,
  • VTK运行绘图结果出错,报JVM问题
  • 多态,覆盖,重载
  • 多线程:Java中实现多线程的两种方式之间的区别
  • 查看python已经安装的包
  • java:VTKImagedata绘制三维体
  • python :sort() , sorted() , searchsorted(), np.linspace() ,mean()
  • Spring总结
  • IoC
  • 解决散点数据插值中的问题:输入含有 NaN 的数据
  • pykrige.ok3d.OrdinaryKriging3D函数定义分析
  • 克里金插值程序
  • mysql “group by ”与order by的研究
  • struts2校验、ajax校验、javascript验证有何区别及联系?
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • es6(二):字符串的扩展
  • ES6系列(二)变量的解构赋值
  • Git的一些常用操作
  • Java基本数据类型之Number
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Mysql5.6主从复制
  • python docx文档转html页面
  • Python连接Oracle
  • spark本地环境的搭建到运行第一个spark程序
  • Travix是如何部署应用程序到Kubernetes上的
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 码农张的Bug人生 - 初来乍到
  • 赢得Docker挑战最佳实践
  • 走向全栈之MongoDB的使用
  • hi-nginx-1.3.4编译安装
  • mysql面试题分组并合并列
  • #include
  • #stm32整理(一)flash读写
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (02)Hive SQL编译成MapReduce任务的过程
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Java数据结构)ArrayList
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (九)One-Wire总线-DS18B20
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (四)Controller接口控制器详解(三)
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)基于IDEA的JAVA基础1
  • (转)EOS中账户、钱包和密钥的关系
  • .“空心村”成因分析及解决对策122344
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat批处理(一):@echo off
  • .net Application的目录
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .Net8 Blazor 尝鲜