VTK中的points和cell

vtkPoints:SetPoint( vtkIdType id, double x[3] )和InsertPoint( vtkIdType id, double x[3] )可以设置点的vtkIdType(类似ID值)和三维坐标。两个函数的区别在于:InsertPoint先要完成点的范围检查和内存分配工作,索引速度较慢。注:这两个函数的实质是调用SetTuple( const vtkIdType i, const float *tuple )和InsertTuple( const vtkIdType i, const float *tuple )在数组的第i个位置赋值。适用bit/char/data/double/float等所有数组。如 voidFloatArray::SetTuple( const vtkIdType i, const float *tuple ); 参数1位置,参数2实际数据:pcoords->SetTuple( i, pts[i] );

vtkCellArray中设置cell单元,调用InsertNextCell函数逐步添加新的cell,例如函数vtkCellArray::InsertNextCell ( vtkIdType    npts,   vtkIdType *    pts )的第一个参数值标是cell中点的个数,第二个参数指向那些点的坐标数据。(说明:vtkIdType *pts,存储的是所包括点在points中的顺序信息,其个数当然应该和前面的npts一致。这里,2点可以连成一条线,三点可以得到一个面。也就是说:vtk中关于点、线、面的那些信息都是存放在cellarray中,应用时也是直接对cellarray指针进行处理,数据的写入和读取在vtkCellArray类完成。

接下来的工作是定义一个vtkPolyData,得到包括顶点、线、多边形、三角形带在内的几何结构,即三维实体。这里通过函数SetPoints设置点信息,SetPolys设置单元排列(cell array)定义多边形,cell array设置单元排列(cell array)定义线,SetStrips设置单元排列(cell array)定义三角形带strip,SetVerts设置顶点,诸如此类。

#include "stdafx.h"
#include "vtkCellArray.h"
#include "vtkDoubleArray.h"
#include "vtkFloatArray.h"
#include "vtkIntArray.h"
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i;
//创建一个浮点型数组存储"点"
vtkFloatArray *pcoords = vtkFloatArray::New();
//设置维度,点->3
pcoords->SetNumberOfComponents( 3 );
//设置数组个数
pcoords->SetNumberOfTuples( 4 );
//指定每一个数组,具体的点坐标
float pts[4][3] = { { 0.0, 0.0, 0.0 }, { 0.0, 1.0, 0.0 },
       { 1.0, 0.0, 0.0 }, { 1.0, 1.0, 0.0}} ;
for( i=0; i<4; i++ )
{
   //设置数组中的点
   pcoords->SetTuple( i, pts[i] );
}
vtkPoints *points = vtkPoints::New();
//获得四个点
points->SetData( pcoords );
//创建网格数组
vtkCellArray *strips = vtkCellArray::New();
//设置单元由几个点组成
/* strips->InsertNextCell( 4 );
strips->InsertCellPoint( 0 );
strips->InsertCellPoint( 1 );
strips->InsertCellPoint( 2 );
strips->InsertCellPoint( 3 );*/
strips->InsertNextCell( 3 );
strips->InsertCellPoint( 0 );
strips->InsertCellPoint( 1 );
strips->InsertCellPoint( 2 );
//strips->InsertCellPoint( 3 );
//创建整形数组
vtkIntArray *temperature = vtkIntArray::New();
temperature->SetName( "Temperature" );
temperature->InsertNextValue( 60 );
temperature->InsertNextValue( 70 );
temperature->InsertNextValue( 80 );
// temperature->InsertNextValue( 90 );
/* //创建双精度型数组
vtkDoubleArray *vorticity = vtkDoubleArray::New();
vorticity->SetName( "Vorticity" );
vorticity->InsertNextValue( 2.7 );
vorticity->InsertNextValue( 4.1 );
vorticity->InsertNextValue( 5.3 );
vorticity->InsertNextValue( 3.4 );*/
//创建数据集
vtkPolyData *polydata = vtkPolyData::New();
//指定点和网格
polydata->SetPoints( points );
polydata->SetStrips( strips );
//指定标量
polydata->GetPointData()->SetScalars( temperature );
//polydata->GetPointData()->AddArray( vorticity ); 
vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
mapper->SetInput( polydata );
mapper->SetScalarRange( 0, 40 );
// Create an actor.
vtkActor* actor = vtkActor::New();
actor->SetMapper(mapper);
// Create the rendering objects.
vtkRenderer* ren = vtkRenderer::New();
ren->AddActor(actor);
vtkRenderWindow* renWin = vtkRenderWindow::New();
renWin->AddRenderer(ren);
vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::New();
iren->SetRenderWindow(renWin);
iren->Initialize();
iren->Start();
return 0;
}

在C#使用VTK(Visualization Toolkit)来绘制坐标轴和网格线可以通过以下步骤实现: 1. 导入VTK库: ```csharp using Kitware.VTK; ``` 2. 创建vtkRenderer和vtkRenderWindow对象: ```csharp vtkRenderer renderer = vtkRenderer.New(); vtkRenderWindow renderWindow = vtkRenderWindow.New(); renderWindow.AddRenderer(renderer); ``` 3. 创建vtkRenderWindowInteractor对象并设置renderWindow: ```csharp vtkRenderWindowInteractor renderWindowInteractor = vtkRenderWindowInteractor.New(); renderWindowInteractor.SetRenderWindow(renderWindow); ``` 4. 创建vtkAxesActor对象来绘制坐标轴: ```csharp vtkAxesActor axesActor = vtkAxesActor.New(); axesActor.AxisLabelsOff(); // 关闭坐标轴标签 axesActor.SetTotalLength(1, 1, 1); // 设置坐标轴长度 axesActor.SetShaftTypeToCylinder(); // 设置坐标轴形状为圆柱体 axesActor.SetCylinderRadius(0.02); // 设置坐标轴圆柱体半径 axesActor.SetConeRadius(0.1); // 设置坐标轴锥形半径 vtkOrientationMarkerWidget axesWidget = vtkOrientationMarkerWidget.New(); axesWidget.SetOutlineColor(0.9300, 0.5700, 0.1300); // 设置边框颜色 axesWidget.SetOrientationMarker(axesActor); axesWidget.SetInteractor(renderWindowInteractor); axesWidget.EnabledOn(); ``` 5. 创建vtkCellArray和vtkPolyData对象来绘制网格线: ```csharp vtkCellArray cellArray = vtkCellArray.New(); vtkPolyData polyData = vtkPolyData.New(); polyData.SetPoints(points); // 设置网格点坐标 for (int i = 0; i < numberOfLines; i++) { vtkLine line = vtkLine.New(); line.GetPointIds().SetId(0, lineIndices[i, 0]); line.GetPointIds().SetId(1, lineIndices[i, 1]); cellArray.InsertNextCell(line); } polyData.SetLines(cellArray); ``` 6. 创建vtkPolyDataMapper和vtkActor对象来渲染网格线: ```csharp vtkPolyDataMapper mapper = vtkPolyDataMapper.New(); mapper.SetInputData(polyData); vtkActor actor = vtkActor.New(); actor.SetMapper(mapper); actor.GetProperty().SetColor(1, 1, 1); // 设置网格线颜色 renderer.AddViewProp(actor); ``` 7. 最后,启动渲染循环: ```csharp renderWindow.Render(); renderWindowInteractor.Start(); ``` 以上是简单的示例代码,你可以根据你的需求进行修改和扩展。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值