VTK教程之十二 可视化基础算法-几…

因为数量数据是既有大小又有方向的量,所以矢量数据会处于不断的运动之中,如粒子的随机运动构成了粒子运动的轨迹场,地质体由于受到各种外力、内力的作用,产生了应力场,这些由矢量数据的运动形成的场一般被称为矢量场,在矢量场的作用下,构成矢量数据的几何体会产生变形,如岩土体在应力场的作用下会产生位移,导致岩土体的外在几何形状会发生变化, VTK根据矢量场的作用采用变形或弯曲构成矢量数据几何体的方法来描述矢量数据的运动形态,采用这种方式描述矢量数据运动形态时,必须按比例缩放变形系数,控制几何体的扭曲程度,以免产生几何体失真现象。

下面给出用几何体变形方式描述矢量场的示例程序。

#include "stdafx.h"

#include <vtkSmartPointer.h>

#include <vtkVolume16Reader.h>

#include <vtkMarchingCubes.h>

#include <vtkVectorNorm.h>

#include <vtkPolyDataMapper.h>

#include <vtkActor.h>

#include "vtkCamera.h"

#include "vtkPolyData.h"

#include "vtkPolyDataMapper.h"

#include "vtkRenderWindow.h"

#include "vtkRenderWindowInteractor.h"

#include "vtkRenderer.h"

#include <vtkPolyDataReader.h>

#include <vtkPolyDataNormals.h>

#include <vtkWarpVector.h>

#include <vtkVectorDot.h>

#include <vtkProperty.h>

#include <vtkOutlineFilter.h>

int _tmain(int argc, _TCHAR* argv[])

{

    vtkSmartPointer<vtkPolyDataReader>pPolyRead=vtkPolyDataReader::New();

   /读取多边形数据

    pPolyRead->SetFileName("plate.vtk");

   /提取数据文件中的mode2这部分矢量数据

    pPolyRead->SetVectorsName("mode3");

   /生成多边形数据的法线

    vtkSmartPointer<vtkPolyDataNormals>pNormal=vtkPolyDataNormals::New();

    pNormal->SetInput(pPolyRead->GetOutput());

   /使用矢量数据弯曲几何体

    vtkSmartPointer<vtkWarpVector>pWarpVec=vtkWarpVector::New();

   /设置矢量数据缩放的比例

    pWarpVec->SetScaleFactor(1.0);

    pWarpVec->SetInput(pNormal->GetOutput());

   /点的矢量和其法线点乘,生成点的标量值

    vtkSmartPointer<vtkVectorDot>pVecDot=vtkVectorDot::New();

    pVecDot->SetInput(pWarpVec->GetOutput());

   /创建映射器

    vtkSmartPointer<vtkPolyDataMapper>pMapper=vtkPolyDataMapper::New();

    pMapper->SetInput((vtkPolyData *)pWarpVec->GetOutput());

   /pMapper->ScalarVisibilityOn();

   /pMapper->SetScalarRange(0,1250);//Rang[0],Rang[1]);

    vtkSmartPointer<vtkActor>pActor = vtkActor::New();

    pActor->SetMapper(pMapper);

    pActor->GetProperty()->SetColor(1.0,0.0,0.0);

   /绘制没有发生变形以前的梁的几何形状

   /创建多边形数据的外轮廓线

    vtkSmartPointer<vtkOutlineFilter>pOutLine=vtkOutlineFilter::New();

    pOutLine->SetInput(pPolyRead->GetOutput());

  vtkSmartPointer<vtkPolyDataMapper>pOutlineMapper=vtkPolyDataMapper::New();

    pOutlineMapper->SetInput((vtkPolyData *)pOutLine->GetOutput());

    vtkSmartPointer<vtkActor>pOutlineActor=vtkActor::New();

    pOutlineActor->SetMapper(pOutlineMapper);

    pOutlineActor->GetProperty()->SetColor(0.0,0.0,1.0);

   /绘制

    vtkSmartPointer<vtkRenderer>renderer = vtkRenderer::New();

    vtkSmartPointer<vtkRenderWindow>renWin = vtkRenderWindow::New();

    renWin->AddRenderer(renderer);

 

    vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkRenderWindowInteractor::New();

    iren->SetRenderWindow(renWin);

    renderer->AddActor(pActor);

    renderer->AddActor(pOutlineActor);

    renderer->ResetCamera();

    renderer->SetBackground(1,1,1);

    renWin->SetSize(300,300);

    renWin->Render();

    iren->Start();

    return 0;

}

该示例程序描述了 梁的位移,程序读取一个多边形数据文件,在数据文件中存储了每个点的位移数据,pPolyRead->SetVectorsName("mode3")表示提取数据文件中mode3部分的位移数据,VTK用vtkWarpVector类实现用矢量数据变形几何体,在该类中可以设置设置矢量数据缩放的比例,控制几何体的边形,程序运行的结果如图所示:



图中蓝色线框表示变形前的状态。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值