建设网站需要哪个语言编译器,单招网是哪个网站制作公司做的,西安官网排名推广,没有网站做分类信息群发目录
前言#xff1a;
效果#xff1a;
实现步骤#xff1a;
Code: 前言#xff1a;
本文介绍了Python VTK映射三维模型表面距离#xff0c;通过如何使用VTK计算两个三维模型(stl)的表面距离#xff0c;并将其距离值以颜色映射到模型#xff0c;可用于对比 两相模型…目录
前言
效果
实现步骤
Code: 前言
本文介绍了Python VTK映射三维模型表面距离通过如何使用VTK计算两个三维模型(stl)的表面距离并将其距离值以颜色映射到模型可用于对比 两相模型的相似度
效果
我使用同一个stl 模型旋转了一点进行对比原点是黄色旋转最少 实现步骤
数据准备 需要准备两个stl文件、Python需要安装vtk库
步骤一数据读取 首先通过vtk.vtkSTLReader() 定义stl文件读取接口再通过reader1.GetOutput() 就可以获得stl在vtk工作流的数据。
步骤二去除重复点 通过vtk.vtkCleanPolyData() 可以去除模型中的重复点
步骤三计算距离 使用 vtk.vtkDistancePolyDataFilter() 使用上一步中过滤掉重复点后的数据作为输入。如distanceFilter.SetInputConnection(1, clean1.GetOutputPort()) 其中第一个参数就是输入数据的标号从0开始计数第二个参数就是输入的数据。我们将vtkDistancePolyDataFilter的输出到mapper就完成距离映射了。
步骤四颜色配置 lut vtk.vtkLookupTable() 相当于一个调色盘函数通过对其参数改变可以调整最终映射的颜色范围。 scalarBar vtk.vtkScalarBarActor() 就是颜色条,按照前面的调色盘的结果将距离数值映射成颜色。 Code:
import vtkinput1 vtk.vtkPolyData()
reader1 vtk.vtkSTLReader()
reader1.SetFileName(leftlumen.stl)
reader1.Update()
input1 reader1.GetOutput() # 读取模型Ainput2 vtk.vtkPolyData()
input2.DeepCopy(input1)pTransformSTL vtk.vtkTransform()
pTransformSTL.RotateY(0.1)
pTransformSTL.Update()transFilter vtk.vtkTransformPolyDataFilter()transFilter.SetInputData(input2)
transFilter.SetTransform(pTransformSTL)
transFilter.Update()# 数据合并可以合并显示两个模型
clean1 vtk.vtkCleanPolyData()
clean1.SetInputData(input1)clean2 vtk.vtkCleanPolyData()
clean2.SetInputData(transFilter.GetOutput())distanceFilter vtk.vtkDistancePolyDataFilter()distanceFilter.SetInputConnection(1, clean1.GetOutputPort())
distanceFilter.SetInputConnection(0, clean2.GetOutputPort())
distanceFilter.SignedDistanceOff()
distanceFilter.Update() # 计算距离
distanceFilter.GetOutputPort()
mapper vtk.vtkPolyDataMapper() # 配置mapper
mapper.SetInputConnection(distanceFilter.GetOutputPort())
mapper.SetScalarRange( # 设置颜色映射范围distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[0],distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[1])
actor vtk.vtkActor()
actor.SetMapper(mapper)
actor1 vtk.vtkActor()
actor1.SetMapper(mapper)
lut vtk.vtkLookupTable()
lut.SetHueRange(0.2, 0.7) # 映射的颜色变换参数自己调颜色
# lut.SetAlphaRange(1.0, 1.0)
# lut.SetValueRange(1.0, 1.0)
# lut.SetSaturationRange(1.0, 1.0)
# lut.SetNumberOfTableValues(256)
mapper.SetLookupTable(lut)
mapper2 vtk.vtkPolyDataMapper()
mapper2.SetInputData((distanceFilter.GetSecondDistanceOutput()))
mapper2.SetScalarRange( # 设置颜色映射范围distanceFilter.GetSecondDistanceOutput().GetPointData().GetScalars().GetRange()[0],distanceFilter.GetSecondDistanceOutput().GetPointData().GetScalars().GetRange()[1])actor2 vtk.vtkActor()
actor2.SetMapper(mapper2)scalarBar vtk.vtkScalarBarActor() # 设置color_bar
scalarBar.SetLookupTable(mapper.GetLookupTable())
scalarBar.SetTitle(SD(mm))
scalarBar.SetNumberOfLabels(5) # 设置要显示的刻度标签数。自己设定色带的位置
scalarBar.SetMaximumNumberOfColors(10)
# scalarBar.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport()
# scalarBar.GetPositionCoordinate().SetValue(0.01, 0.49) # 参数越小越靠左第二个参数越大越往上
# scalarBar.SetWidth(0.16)
# scalarBar.SetHeight(0.5)
# scalarBar.SetTextPositionToPrecedeScalarBar() # 标题和刻度标记是否应在标量栏之前(文字会出现在条形左边)
# # 设置标题和条形之间的边距
# scalarBar.SetVerticalTitleSeparation(10)
# # 设置标题颜色
scalarBar.DrawTickLabelsOn()
scalarBar.GetTitleTextProperty().SetColor(0, 0, 0)
scalarBar.GetLabelTextProperty().SetColor(0, 0, 0)
arender vtk.vtkRenderer()
arender.SetViewport(0, 0.0, 1, 1.0)
renWin vtk.vtkRenderWindow()
renWin.AddRenderer(arender)
iren vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
style vtk.vtkInteractorStyleTrackballActor()
iren.SetInteractorStyle(style)
aCamera vtk.vtkCamera()
aCamera.SetViewUp(0, 0, -1)
aCamera.SetPosition(0, -1, 0)
aCamera.ComputeViewPlaneNormal()
aCamera.Azimuth(30.0)
aCamera.Elevation(30.0)
aCamera.Dolly(1.5)arender.AddActor(actor)
# arender.AddActor(actor1)
arender.SetActiveCamera(aCamera)
arender.ResetCamera()
arender.SetBackground(1, 1, 1)
arender.ResetCameraClippingRange()
arender.AddActor2D(scalarBar)renWin.Render()
iren.Initialize()
iren.Start()