You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.4 KiB
150 lines
4.4 KiB
#!/usr/bin/env python
|
|
|
|
# This example demonstrates how to use a constraint polygon in
|
|
# Delaunay triangulation.
|
|
|
|
import vtk
|
|
from vtk.util.colors import peacock
|
|
|
|
# Generate the input points and constrained edges/polygons.
|
|
points = vtk.vtkPoints()
|
|
points.InsertPoint(0, 1, 4, 0)
|
|
points.InsertPoint(1, 3, 4, 0)
|
|
points.InsertPoint(2, 7, 4, 0)
|
|
points.InsertPoint(3, 11, 4, 0)
|
|
points.InsertPoint(4, 13, 4, 0)
|
|
points.InsertPoint(5, 13, 8, 0)
|
|
points.InsertPoint(6, 13, 12, 0)
|
|
points.InsertPoint(7, 10, 12, 0)
|
|
points.InsertPoint(8, 7, 12, 0)
|
|
points.InsertPoint(9, 4, 12, 0)
|
|
points.InsertPoint(10, 1, 12, 0)
|
|
points.InsertPoint(11, 1, 8, 0)
|
|
points.InsertPoint(12, 3.5, 5, 0)
|
|
points.InsertPoint(13, 4.5, 5, 0)
|
|
points.InsertPoint(14, 5.5, 8, 0)
|
|
points.InsertPoint(15, 6.5, 8, 0)
|
|
points.InsertPoint(16, 6.5, 5, 0)
|
|
points.InsertPoint(17, 7.5, 5, 0)
|
|
points.InsertPoint(18, 7.5, 8, 0)
|
|
points.InsertPoint(19, 9, 8, 0)
|
|
points.InsertPoint(20, 9, 5, 0)
|
|
points.InsertPoint(21, 10, 5, 0)
|
|
points.InsertPoint(22, 10, 7, 0)
|
|
points.InsertPoint(23, 11, 5, 0)
|
|
points.InsertPoint(24, 12, 5, 0)
|
|
points.InsertPoint(25, 10.5, 8, 0)
|
|
points.InsertPoint(26, 12, 11, 0)
|
|
points.InsertPoint(27, 11, 11, 0)
|
|
points.InsertPoint(28, 10, 9, 0)
|
|
points.InsertPoint(29, 10, 11, 0)
|
|
points.InsertPoint(30, 9, 11, 0)
|
|
points.InsertPoint(31, 9, 9, 0)
|
|
points.InsertPoint(32, 7.5, 9, 0)
|
|
points.InsertPoint(33, 7.5, 11, 0)
|
|
points.InsertPoint(34, 6.5, 11, 0)
|
|
points.InsertPoint(35, 6.5, 9, 0)
|
|
points.InsertPoint(36, 5, 9, 0)
|
|
points.InsertPoint(37, 4, 6, 0)
|
|
points.InsertPoint(38, 3, 9, 0)
|
|
points.InsertPoint(39, 2, 9, 0)
|
|
polys = vtk.vtkCellArray()
|
|
polys.InsertNextCell(12)
|
|
polys.InsertCellPoint(0)
|
|
polys.InsertCellPoint(1)
|
|
polys.InsertCellPoint(2)
|
|
polys.InsertCellPoint(3)
|
|
polys.InsertCellPoint(4)
|
|
polys.InsertCellPoint(5)
|
|
polys.InsertCellPoint(6)
|
|
polys.InsertCellPoint(7)
|
|
polys.InsertCellPoint(8)
|
|
polys.InsertCellPoint(9)
|
|
polys.InsertCellPoint(10)
|
|
polys.InsertCellPoint(11)
|
|
polys.InsertNextCell(28)
|
|
polys.InsertCellPoint(39)
|
|
polys.InsertCellPoint(38)
|
|
polys.InsertCellPoint(37)
|
|
polys.InsertCellPoint(36)
|
|
polys.InsertCellPoint(35)
|
|
polys.InsertCellPoint(34)
|
|
polys.InsertCellPoint(33)
|
|
polys.InsertCellPoint(32)
|
|
polys.InsertCellPoint(31)
|
|
polys.InsertCellPoint(30)
|
|
polys.InsertCellPoint(29)
|
|
polys.InsertCellPoint(28)
|
|
polys.InsertCellPoint(27)
|
|
polys.InsertCellPoint(26)
|
|
polys.InsertCellPoint(25)
|
|
polys.InsertCellPoint(24)
|
|
polys.InsertCellPoint(23)
|
|
polys.InsertCellPoint(22)
|
|
polys.InsertCellPoint(21)
|
|
polys.InsertCellPoint(20)
|
|
polys.InsertCellPoint(19)
|
|
polys.InsertCellPoint(18)
|
|
polys.InsertCellPoint(17)
|
|
polys.InsertCellPoint(16)
|
|
polys.InsertCellPoint(15)
|
|
polys.InsertCellPoint(14)
|
|
polys.InsertCellPoint(13)
|
|
polys.InsertCellPoint(12)
|
|
|
|
polyData = vtk.vtkPolyData()
|
|
polyData.SetPoints(points)
|
|
polyData.SetPolys(polys)
|
|
|
|
# Notice this trick. The SetInput() method accepts a vtkPolyData that
|
|
# is also the input to the Delaunay filter. The points of the
|
|
# vtkPolyData are used to generate the triangulation; the polygons are
|
|
# used to create a constraint region. The polygons are very carefully
|
|
# created and ordered in the right direction to indicate inside and
|
|
# outside of the polygon.
|
|
delny = vtk.vtkDelaunay2D()
|
|
delny.SetInput(polyData)
|
|
delny.SetSource(polyData)
|
|
mapMesh = vtk.vtkPolyDataMapper()
|
|
mapMesh.SetInputConnection(delny.GetOutputPort())
|
|
meshActor = vtk.vtkActor()
|
|
meshActor.SetMapper(mapMesh)
|
|
|
|
# Now we just pretty the mesh up with tubed edges and balls at the
|
|
# vertices.
|
|
extract = vtk.vtkExtractEdges()
|
|
extract.SetInputConnection(delny.GetOutputPort())
|
|
tubes = vtk.vtkTubeFilter()
|
|
tubes.SetInputConnection(extract.GetOutputPort())
|
|
tubes.SetRadius(0.1)
|
|
tubes.SetNumberOfSides(6)
|
|
mapEdges = vtk.vtkPolyDataMapper()
|
|
mapEdges.SetInputConnection(tubes.GetOutputPort())
|
|
edgeActor = vtk.vtkActor()
|
|
edgeActor.SetMapper(mapEdges)
|
|
edgeActor.GetProperty().SetColor(peacock)
|
|
edgeActor.GetProperty().SetSpecularColor(1, 1, 1)
|
|
edgeActor.GetProperty().SetSpecular(0.3)
|
|
edgeActor.GetProperty().SetSpecularPower(20)
|
|
edgeActor.GetProperty().SetAmbient(0.2)
|
|
edgeActor.GetProperty().SetDiffuse(0.8)
|
|
|
|
# Create the rendering window, renderer, and interactive renderer
|
|
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(meshActor)
|
|
ren.AddActor(edgeActor)
|
|
ren.SetBackground(0, 0, 0)
|
|
renWin.SetSize(450, 300)
|
|
|
|
ren.ResetCamera()
|
|
ren.GetActiveCamera().Zoom(2)
|
|
|
|
iren.Initialize()
|
|
renWin.Render()
|
|
iren.Start()
|
|
|