Python VTK:使用vtkDelaunay2D创建多边形和孔不工作

Python VTK:使用vtkDelaunay2D创建多边形和孔不工作,python,vtk,Python,Vtk,我想渲染一个在VTK中有洞的多边形。我发现vtkDelaunay2D类应该可以做到这一点。我在这里学习了教程,效果非常好 之后,我尝试用不同的孔创建不同的多边形。我不明白为什么它不起作用,我想知道我需要改变什么 应该是这样的。 这就是它在现实中的样子 这是我使用的代码: import vtk import random points = vtk.vtkPoints() ls = [ [2, 2], [-2, 2], [-2, -2], [2, -2], [5, 5], [

我想渲染一个在VTK中有洞的多边形。我发现vtkDelaunay2D类应该可以做到这一点。我在这里学习了教程,效果非常好

之后,我尝试用不同的孔创建不同的多边形。我不明白为什么它不起作用,我想知道我需要改变什么

应该是这样的。 这就是它在现实中的样子

这是我使用的代码:

import vtk
import random

points = vtk.vtkPoints()

ls = [
    [2, 2], [-2, 2], [-2, -2], [2, -2], 
    [5, 5], [-5, 5], [-8, 0], [-5, -5], [5, -5], [8, 0],
    [10, 10], [-10, 10], [-10, -10], [10, -10]
]
for x, y in ls:
    points.InsertNextPoint(x, y, 0)

aPolyData = vtk.vtkPolyData()
aPolyData.SetPoints(points)


aCellArray = vtk.vtkCellArray()

cPolygon = vtk.vtkPolygon()
start = 0
for idd in range(start, start + 4):
    cPolygon.GetPointIds().InsertNextId(idd)
aCellArray.InsertNextCell(cPolygon)

boundary = vtk.vtkPolyData()
boundary.SetPoints(aPolyData.GetPoints())
boundary.SetPolys(aCellArray)

delaunay = vtk.vtkDelaunay2D()
delaunay.SetInputData(aPolyData)
delaunay.SetSourceData(boundary)

################################## Actors etc:
meshMapper = vtk.vtkPolyDataMapper()
meshMapper.SetInputConnection(delaunay.GetOutputPort())

colors = vtk.vtkNamedColors()

meshActor = vtk.vtkActor()
meshActor.SetMapper(meshMapper)
meshActor.GetProperty().EdgeVisibilityOn()
meshActor.GetProperty().SetEdgeColor(colors.GetColor3d("Peacock"))
meshActor.GetProperty().SetInterpolationToFlat()


boundaryMapper = vtk.vtkPolyDataMapper()
boundaryMapper.SetInputData(boundary)

boundaryActor = vtk.vtkActor()
boundaryActor.SetMapper(boundaryMapper)
boundaryActor.GetProperty().SetColor(colors.GetColor3d("Raspberry"))
boundaryActor.GetProperty().SetLineWidth(3)
boundaryActor.GetProperty().EdgeVisibilityOn()
boundaryActor.GetProperty().SetEdgeColor(1, 1, 0)
boundaryActor.GetProperty().SetRepresentationToWireframe()

renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)

renderer.AddActor(meshActor)
renderer.AddActor(boundaryActor)
renderer.SetBackground(colors.GetColor3d("Mint"))

renderWindow.SetSize(640, 480)
renderWindow.Render()
renderWindowInteractor.Start()
据我所知,这应该行得通。像在示例中一样,我创建了一组点,围绕前4个点(应该是孔)定义一个边界,然后只渲染它。

更改

适用于范围内的idd(开始,开始+4):

进入


对于反向idd(范围(开始,开始+4)):

谢谢,可以了!但是你知道它为什么起作用吗?不客气-它起作用是因为点顺序定义了多边形的方向。事实上,发布的示例也有效。。它只是把广场外面的东西都剪掉了:)