VTK教程之十三 可视化基础算法-位…

  位移图主要描绘矢量点沿着与其所在表面垂直正交方向的运动,是一种可视化矢量数据的方法,广泛应用于用位移或应变矢量场描述物体运动的场合,如有限元分析位移、应力场的描述,经常采用这种方式,用位移图描述矢量数据在其表面上的运动形态时,常把矢量数据转化成标量数据,转换的方式采用矢量点的运动方向和表面的法向量两个矢量点乘,得到矢量点的标量值,如果标量值为正,表示为正位移(矢量的运动方向和法向量方向一致),如果为负,表示为负位移(矢量点的运动方向和法向量的方向相反),转化为标量的方法如下图所示:

图中矢量V表示矢量点的运动方向,N表示矢量点在表面的法向量。

下面给出位移图的示例程序。

#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>

#include <vtkLookupTable.h>

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

{

    int i;

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

   /读取多边形数据

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

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

    pPolyRead->SetVectorsName("mode8");

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

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

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

    pWarpVec->SetScaleFactor(0.5);

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

   /生成多边形数据的法线

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

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

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

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

   /pVecDot->SetInput(pNormal->GetOutput());

    pVecDot->SetInputConnection(pNormal->GetOutputPort());

   /创建颜色表

    vtkSmartPointer<vtkLookupTable>pColorTable=vtkLookupTable::New();

    pColorTable->SetNumberOfColors(256);

    pColorTable->Build();

    for(i=0;i<128;i++){

pColorTable->SetTableValue(i,(128.0-i)/128.0,(128.0-i)/128.0,(128.0-i)/128.0);

    }

    for(i=128;i<256;i++){

       pColorTable->SetTableValue(i,(i-128.0)/128.0,(i-128.0)/128.0,(i-128.0)/128.0);

    }

   /创建映射器

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

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

    pMapper->SetInputConnection(pVecDot->GetOutputPort());

    pMapper->ScalarVisibilityOn();

    pMapper->SetLookupTable(pColorTable);

    pMapper->SetScalarRange(-1,1);//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);

    pOutlineActor->GetProperty()->SetLineWidth(2.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;

}

示例程序用vtkVectorDot类计算矢量点的标量值,并且设定了一个颜色映射表,用亮度表示位移变化比较大的区域,黑暗的地方表示位移变化小的区域,和几何体变形相比,位移图最大的特点是将矢量数据转化成标量数据,然后用颜色映射的方法表示位移的状态,本示例程序将几何体变形和位移图叠加,可以直观的进行对比,程序运行结果如图所示:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值