创建一个vtkStructuredGrid文件,VTK用Glyph可视化流场

写两个程序创建数据集

  1. 六个特征点,
  2. 尺寸大小(长宽比、面积大小)
  3. 随机干扰,干扰强度

Glyph Arrow

以箭头方式可视化流场
创建了一个三维[4,4,4]的sgrid.vtk的网格文件,和一个polydata类型的sgridExtend.vtk文件

"""
===============================
  -*- coding:utf-8 -*-
  Author    :hanjinyue
  Time      :2021/4/2 12:06
  File      :HelloVTK\SgridExtend.py
================================
"""

import vtk

#data
p = vtk.vtkPoints()#点集
#创建向量数组
vectors = vtk.vtkFloatArray()#向量数组
vector = [0.0,0.0,0.0]
vectors.SetNumberOfComponents(3)
sum = 0
for i in range(4):
    for j in range(4):
        for k in range(4):
            p.InsertPoint(sum,k+5.0,j+5.0,i+5.0)
            vector[0] = 0.5*k+0.1
            vector[1] = 0.2*j+0.2
            vector[2] = 0.3*i + 0.3
            vectors.InsertNextTuple(vector)
            sum = sum +1



weights = vtk.vtkDoubleArray()
weights.SetNumberOfValues(sum)
for i in range(sum):
    weights.SetValue(i,i+0.5)#第i个点的属性为i+0.5

#结构化网格数据
sgrid = vtk.vtkStructuredGrid()

dims = [4,4,4]
sgrid.SetDimensions(dims)
sgrid.SetPoints(p)
sgrid.GetPointData().SetVectors(vectors)
sgrid.GetPointData().SetScalars(weights)

writesgrid = vtk.vtkStructuredGridWriter()
writesgrid.SetFileName("sgrid.vtk")
writesgrid.SetInputData(sgrid)
writesgrid.Write()
#extract plane
compPlane = vtk.vtkStructuredGridGeometryFilter()#polyData
compPlane.SetInputData(sgrid)
compPlane.SetExtent(0, 3, 0, 3, 0, 0)
#将生成的数据集写到polydata.vtk文件里,保存到当前目录下
writer = vtk.vtkPolyDataWriter()
writer.SetFileName("sgridExtend.vtk")
writer.SetInputConnection(compPlane.GetOutputPort())
writer.Write()

#arrow
arrow = vtk.vtkArrowSource()

#glypy
glyph = vtk.vtkGlyph3D()
glyph.SetInputConnection(compPlane.GetOutputPort())
glyph.SetSourceConnection(arrow.GetOutputPort())
glyph.SetVectorModeToUseVector()
glyph.SetScaleModeToScaleByVector()
glyph.SetScaleFactor(0.2)
spikeMapper = vtk.vtkPolyDataMapper()
spikeMapper.SetInputConnection(glyph.GetOutputPort())
spikeActor = vtk.vtkActor()
spikeActor.SetMapper(spikeMapper)
spikeActor.GetProperty().SetColor(0.0, 0.79, 0.34)#glyphActor

#4.1 outline:获取外边廓线
outline = vtk.vtkOutlineFilter()
outline.SetInputData(sgrid)


outlineMapper = vtk.vtkPolyDataMapper()
outlineMapper.SetInputConnection(outline.GetOutputPort())

outlineActor = vtk.vtkActor()
outlineActor.SetMapper(outlineMapper)

outlineProp = outlineActor.GetProperty()
outlineProp.SetColor(1, 0, 0)#红色

# Create the RenderWindow, Renderer and both Actors
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

# Add the actors to the renderer, set the background and size
#ren.AddActor(franActor)
ren.AddActor(spikeActor)
ren.AddActor(outlineActor)
renWin.SetSize(500, 500)
ren.SetBackground(0.1, 0.2, 0.4)

# Set a nice camera position.
ren.ResetCamera()
cam1 = ren.GetActiveCamera()
cam1.Zoom(1.4)
cam1.Azimuth(110)

iren.Initialize()
renWin.Render()
iren.Start()


Glyph cone 圆锥

"""
===============================
  -*- coding:utf-8 -*-
  Author    :hanjinyue
  Time      :2021/4/2 14:36
  File      :HelloSgridGlyph.py
================================
"""

import vtk
reader = vtk.vtkStructuredGridReader()
reader.SetFileName("structuredGrid.vtk")

cone = vtk.vtkConeSource()
cone.SetResolution(6)#设置用于表示圆锥的面数
transform = vtk.vtkTransform()
transform.Translate(0.0, 0.0, 0.0)
transformF = vtk.vtkTransformPolyDataFilter()#转换多边形数据集的点以及相关的法线和向量,继承自vtkPolyDataAlgorithm
transformF.SetInputConnection(cone.GetOutputPort())
transformF.SetTransform(transform)

glyph = vtk.vtkGlyph3D()#继承自vtkPolyDataAlgorithm
glyph.SetInputConnection(reader.GetOutputPort())
glyph.SetSourceConnection(cone.GetOutputPort())
glyph.SetVectorModeToUseVector()#指定使用法线执行矢量操作。
glyph.SetScaleModeToScaleByVector()#SetScaleMode(),可以按标量缩放,也可以按矢量/法线幅度缩放。
glyph.SetScaleFactor(0.2)#指定比例因子以缩放对象。
spikeMapper = vtk.vtkPolyDataMapper()
spikeMapper.SetInputConnection(glyph.GetOutputPort())
spikeActor = vtk.vtkActor()
spikeActor.SetMapper(spikeMapper)
spikeActor.GetProperty().SetColor(0.0, 0.79, 0.34)#glyphActor

#4.1 outline:获取外边廓线
outline = vtk.vtkOutlineFilter()
outline.SetInputConnection(reader.GetOutputPort())

outlineMapper = vtk.vtkPolyDataMapper()#为什么使用vtkPolyDataMapper
outlineMapper.SetInputConnection(outline.GetOutputPort())
#void vtkPolyDataMapper::SetInputData	(	vtkPolyData * 	in	)

outlineMapper = vtk.vtkPolyDataMapper()
outlineMapper.SetInputConnection(outline.GetOutputPort())
print("outline.GetOutputPort().type = ",outline.GetOutputPort())

outlineActor = vtk.vtkActor()
outlineActor.SetMapper(outlineMapper)

outlineProp = outlineActor.GetProperty()
outlineProp.SetColor(1, 0, 0)#红色

# Create the RenderWindow, Renderer and both Actors
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

# Add the actors to the renderer, set the background and size
#ren.AddActor(franActor)
ren.AddActor(spikeActor)
ren.AddActor(outlineActor)
renWin.SetSize(100, 100)
ren.SetBackground(0.1, 0.2, 0.4)


print("end1")
# Set a nice camera position.
ren.ResetCamera()
cam1 = ren.GetActiveCamera()
cam1.Zoom(1.4)
cam1.Azimuth(110)

iren.Initialize()
renWin.Render()
iren.Start()
print("end")

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问。以下是使用 VTK 可视化云图的程序示例: #include <vtkSmartPointer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderer.h> #include <vtkSphereSource.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkProperty.h> #include <vtkCamera.h> int main(int argc, char *argv[]) { // 创建球体数据源 vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New(); sphereSource->SetCenter(., ., .); sphereSource->SetRadius(1.); sphereSource->SetPhiResolution(30); sphereSource->SetThetaResolution(30); // 创建球体的 Mapper vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(sphereSource->GetOutputPort()); // 创建球体的 Actor vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); actor->GetProperty()->SetColor(1., ., .); actor->GetProperty()->SetOpacity(.5); // 创建渲染器和窗口 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 将 Actor 添加到渲染器中 renderer->AddActor(actor); renderer->SetBackground(., ., .); // 设置相机位置和方向 vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New(); camera->SetPosition(., ., 5.); camera->SetFocalPoint(., ., .); renderer->SetActiveCamera(camera); // 创建交互器并启动渲染 vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); renderWindow->Render(); interactor->Start(); return ; }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值