두 polydata 개체 사이의 최소 거리를 확인하려고 vtk를 사용하고 있습니다. 최소 거리를 결정하기 위해 vtkDistancePolyDataFilter
을 사용하고 있지만이 최소 결과를 정의하는 각 객체에서 연관된 x, y, z 점을 어떻게 결정합니까?두 개의 vtkPolyData 객체간에 가장 근접한 접근법 벡터를 그립니까?
아래의 최소 예제는 원통과의 거리에 따라 입방체의 색을 지정합니다. 대신 각 vtkPolyData
개체의 가장 가까운 점 사이에 vtkLine
을 그려야합니다. vtkDistancePolyDataFilter
의 결과에는 큐브 오브젝트에 대한 셀, 법선 및 거리가 포함되어있는 것처럼 보입니다. 그러나 최소 거리 또는이 점이 실린더의 점과 어떤 관련이 있는지 쉽게 알아낼 수 없습니다.
편집 :vtkDistancePolyDataFilter
이 최소 거리를 정확하게 계산하고 있다고 확신하지 않습니다. 꼭지점 - 버텍스 상호 작용 만하는 것처럼 보입니다.
import vtk
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
cube = vtk.vtkCubeSource()
cube.SetCenter (1.2, 0.3, 0.4);
transform = vtk.vtkTransform()
transform.RotateX(45)
transform.RotateY(45)
transform.Translate((1.2,0.2,0))
tf = vtk.vtkTransformPolyDataFilter()
tf.SetInput(cube.GetOutput())
tf.SetTransform(transform)
tf.Update()
cubeMapper = vtk.vtkPolyDataMapper()
cubeMapper.SetInput(tf.GetOutput())
cubeActor = vtk.vtkActor()
cubeActor.SetMapper(cubeMapper)
#Create Cylinder
cylinder = vtk.vtkCylinderSource()
cylinder.SetHeight(2)
cylinderMapper = vtk.vtkPolyDataMapper()
cylinderMapper.SetInput(cylinder.GetOutput())
cylinderActor = vtk.vtkActor()
cylinderActor.SetMapper(cylinderMapper)
#Determine distance btwn Cylinder and Cube
distfilt = vtk.vtkDistancePolyDataFilter()
distfilt.SetInputConnection(1, tf.GetOutputPort())
distfilt.SetInputConnection(0, cylinder.GetOutputPort())
distfilt.Update()
#Color the cube based on distance to cylinder
distmapper = vtk.vtkPolyDataMapper()
distmapper.SetInputConnection(distfilt.GetOutputPort(1))
distmapper.SetScalarRange(\
distfilt.GetOutput().GetPointData().GetScalars().GetRange()[0],
distfilt.GetOutput().GetPointData().GetScalars().GetRange()[1],)
distactor = vtk.vtkActor()
distactor.SetMapper(distmapper)
distarray = distfilt.GetOutput().GetPointData().GetScalars()
for i in range(24):
print distarray.GetValue(i)
# Minimum distance is the lowest of these results, but what are the
# Corresponding points on the cylinder and cube?
scalarBar = vtk.vtkScalarBarActor()
scalarBar.SetLookupTable(distmapper.GetLookupTable())
scalarBar.SetTitle("Distance")
scalarBar.SetNumberOfLabels(5)
ren.AddActor(cubeActor)
ren.AddActor(cylinderActor)
ren.AddActor(distactor)
ren.AddActor2D(scalarBar)
iren.Initialize()
renWin.Render()
iren.Start()