• vtkStaticCellLocator intersectWithLine


    代码来自 VTK\Filters\Sources\Testing\Python\TestStaticCellLocatorLineIntersection.py

      1 # -*- coding : UTF-8 -*-
      2 # @file   : testStaticCellLocatorLineIntersection.py
      3 # @Time   : 2022-04-26 14:24
      4 # @Author : wmz
      5 
      6 #!/usr/bin/env python
      7 import vtk
      8 # from vtk.util.misc import vtkGetDataRoot
      9 # VTK_DATA_ROOT = vtkGetDataRoot()
     10 
     11 # retrieve named colors
     12 def GetRGBColor(colorName):
     13     '''
     14         Return the red, green and blue components for a
     15         color as doubles.
     16     '''
     17     rgb = [0.0, 0.0, 0.0]  # black
     18     vtk.vtkNamedColors().GetColorRGB(colorName, rgb)
     19     return rgb
     20 
     21 # Control resolution of test (sphere resolution)
     22 res = 9
     23 
     24 # Create the RenderWindow, Renderer
     25 #
     26 ren = vtk.vtkRenderer()
     27 renWin = vtk.vtkRenderWindow()
     28 renWin.AddRenderer( ren )
     29 
     30 iren = vtk.vtkRenderWindowInteractor()
     31 iren.SetRenderWindow(renWin)
     32 
     33 # Create pipeline. Two spheres: one is the target to
     34 # be intersected against, and is placed inside a static
     35 # cell locator. The second bounds these, it's points
     36 # serve as starting points that shoot rays towards the
     37 # center of the fist sphere.
     38 #
     39 sphere = vtk.vtkSphereSource()
     40 sphere.SetThetaResolution(2*res)
     41 sphere.SetPhiResolution(res)
     42 sphere.Update()
     43 
     44 mapper = vtk.vtkPolyDataMapper()
     45 mapper.SetInputConnection(sphere.GetOutputPort())
     46 
     47 actor = vtk.vtkActor()
     48 actor.SetMapper(mapper)
     49 
     50 # Now the locator
     51 loc = vtk.vtkStaticCellLocator()
     52 loc.SetDataSet(sphere.GetOutput())
     53 loc.SetNumberOfCellsPerNode(5)
     54 loc.BuildLocator()
     55 
     56 locPD = vtk.vtkPolyData()
     57 loc.GenerateRepresentation(4,locPD)
     58 locMapper = vtk.vtkPolyDataMapper()
     59 locMapper.SetInputData(locPD)
     60 locActor = vtk.vtkActor()
     61 locActor.SetMapper(locMapper)
     62 locActor.GetProperty().SetRepresentationToWireframe()
     63 
     64 # Now the outer sphere
     65 sphere2 = vtk.vtkSphereSource()
     66 sphere2.SetThetaResolution(res)
     67 sphere2.SetPhiResolution(int(res/2))
     68 sphere2.SetRadius(3*sphere.GetRadius())
     69 sphere2.Update()
     70 
     71 # Generate intersection points
     72 center = sphere.GetCenter()
     73 polyInts = vtk.vtkPolyData()
     74 pts = vtk.vtkPoints()
     75 spherePts = sphere2.GetOutput().GetPoints()
     76 numRays = spherePts.GetNumberOfPoints()
     77 pts.SetNumberOfPoints(numRays + 1)
     78 
     79 polyRays = vtk.vtkPolyData()
     80 rayPts = vtk.vtkPoints()
     81 rayPts.SetNumberOfPoints(numRays + 1)
     82 lines = vtk.vtkCellArray()
     83 
     84 t = vtk.reference(0.0)
     85 subId = vtk.reference(0)
     86 cellId = vtk.reference(0)
     87 xyz = [0.0,0.0,0.0]
     88 xInt = [0.0,0.0,0.0]
     89 pc = [0.0,0.0,0.0]
     90 
     91 pts.SetPoint(0,center)
     92 rayPts.SetPoint(0,center)
     93 for i in range(0, numRays):
     94     spherePts.GetPoint(i,xyz)
     95     rayPts.SetPoint(i+1,xyz)
     96     cellId = vtk.reference(i);
     97     hit = loc.IntersectWithLine(xyz, center, 0.001, t, xInt, pc, subId, cellId)
     98     if ( hit == 0 ):
     99         print("Missed: {}".format(i))
    100         pts.SetPoint(i+1,center)
    101     else:
    102         pts.SetPoint(i+1,xInt)
    103     lines.InsertNextCell(2)
    104     lines.InsertCellPoint(0)
    105     lines.InsertCellPoint(i+1)
    106 
    107 polyInts.SetPoints(pts)
    108 
    109 polyRays.SetPoints(rayPts)
    110 polyRays.SetLines(lines)
    111 
    112 # Glyph the intersection points
    113 glyphSphere = vtk.vtkSphereSource()
    114 glyphSphere.SetPhiResolution(6)
    115 glyphSphere.SetThetaResolution(12)
    116 
    117 glypher = vtk.vtkGlyph3D()
    118 glypher.SetInputData(polyInts)
    119 glypher.SetSourceConnection(glyphSphere.GetOutputPort())
    120 glypher.SetScaleFactor(0.05)
    121 
    122 glyphMapper = vtk.vtkPolyDataMapper()
    123 glyphMapper.SetInputConnection(glypher.GetOutputPort())
    124 
    125 glyphActor = vtk.vtkActor()
    126 glyphActor.SetMapper(glyphMapper)
    127 glyphActor.GetProperty().SetColor(GetRGBColor('peacock'))
    128 
    129 linesMapper = vtk.vtkPolyDataMapper()
    130 linesMapper.SetInputData(polyRays)
    131 
    132 linesActor = vtk.vtkActor()
    133 linesActor.SetMapper(linesMapper)
    134 linesActor.GetProperty().SetColor(GetRGBColor('tomato'))
    135 
    136 # Render it
    137 ren.AddActor(actor)
    138 ren.AddActor(glyphActor)
    139 ren.AddActor(locActor)
    140 ren.AddActor(linesActor)
    141 
    142 ren.GetActiveCamera().SetPosition(1,1,1)
    143 ren.GetActiveCamera().SetFocalPoint(0,0,0)
    144 ren.ResetCamera()
    145 
    146 renWin.Render()
    147 iren.Start()

    执行结果:

  • 相关阅读:
    mysql免安装使用(win7 64位系统)
    [NOIP2011]瑞士轮
    [NOIP2011]数的划分
    [洛谷2994]超级弹珠
    并查集
    [codevs1073]家族
    快速幂
    [NOI2002]银河英雄传说
    [NOIP2007]矩阵取数游戏
    [洛谷2415]集合求和
  • 原文地址:https://www.cnblogs.com/juluwangshier/p/16194695.html
Copyright © 2020-2023  润新知