# PineRootDecimation

VTKExamples/Python/VisualizationAlgorithms/PineRootDecimation

### Description¶

Demonstrates how to apply the decimation filter to get a reduced data size and then the connectivity filter to remove noisy isosurfaces. The data is from the root system of a pine tree.

To count the number of triangles in the polydata we do the following:

#### C++¶

We use a lambda function

auto NumberofTriangles = [](auto *pd)


#### Python¶

We just implement:

def NumberOfTriangles(pd):


within the scope of the calling function.

Other Languages

See (Cxx)

Question

If you have a simple question about this example contact us at VTKExamplesProject If your question is more complex and may require extended discussion, please use the VTK Discourse Forum

### Code¶

PineRootDecimation.py

#!/usr/bin/env python

import vtk

def main():
def NumberOfTriangles(pd):
"""
Count the number of triangles.
:param pd: vtkPolyData.
:return: The number of triangles.
"""
cells = pd.GetPolys()
numOfTriangles = 0
idList = vtk.vtkIdList()
for i in range(0, cells.GetNumberOfCells()):
cells.GetNextCell(idList)
# If a cell has three points it is a triangle.
if idList.GetNumberOfIds() == 3:
numOfTriangles += 1
return numOfTriangles

colors = vtk.vtkNamedColors()

fileName = get_program_parameters()

# Create the pipeline.
print("Before Decimation.")
print("There are: ", NumberOfTriangles(reader.GetOutput()), "triangles")

deci = vtk.vtkDecimatePro()
deci.SetTargetReduction(0.9)
deci.SetAbsoluteError(0.0005)
deci.MaximumIterations = 6
deci.SetFeatureAngle(30)
deci.SetErrorIsAbsolute(1)
deci.AccumulateErrorOn()
# deci.SplittingOff()
deci.Update()
print("After Decimation.")
print("There are: ", NumberOfTriangles(deci.GetOutput()), "triangles")

connect = vtk.vtkConnectivityFilter()
connect.SetInputConnection(deci.GetOutputPort())
connect.SetExtractionModeToLargestRegion()
connect.Update()
print("After Connectivity.")
print("There are: ", NumberOfTriangles(connect.GetOutput()), "triangles")

isoMapper = vtk.vtkDataSetMapper()
isoMapper.SetInputConnection(connect.GetOutputPort())
isoMapper.ScalarVisibilityOff()
isoActor = vtk.vtkActor()
isoActor.SetMapper(isoMapper)
isoActor.GetProperty().SetColor(colors.GetColor3d("raw_sienna"))

#  Get an outline of the data set for context.
outline = vtk.vtkOutlineFilter()
outlineMapper = vtk.vtkPolyDataMapper()
outlineMapper.SetInputConnection(outline.GetOutputPort())
outlineActor = vtk.vtkActor()
outlineActor.SetMapper(outlineMapper)
outlineActor.GetProperty().SetColor(colors.GetColor3d("Black"))

#  Create the Renderer, RenderWindow and RenderWindowInteractor.
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

# Add the actors to the renderer, set the background and size.
ren.SetBackground(1, 1, 1)
# renWin.SetSize(750, 750)
renWin.SetSize(512, 512)
ren.SetBackground(colors.GetColor3d("SlateGray"))

# render the image

cam = ren.GetActiveCamera()
cam.SetFocalPoint(40.6018, 37.2813, 50.1953)
cam.SetPosition(40.6018, -280.533, 47.0172)
cam.ComputeViewPlaneNormal()
cam.SetClippingRange(26.1073, 1305.36)
cam.SetViewAngle(20.9219)
cam.SetViewUp(0.0, 0.0, 1.0)

iren.Initialize()
renWin.Render()
iren.Start()

def get_program_parameters():
import argparse
description = 'Applying connectivity and decimation filters to remove noisy isosurfaces and reduce data size.'
epilogue = '''
Applying connectivity and decimation filters to remove noisy isosurfaces and reduce data size..

This example demonstrates how to use the vtkConnectivityFilter and vtkDecimate.

'''
parser = argparse.ArgumentParser(description=description, epilog=epilogue,
formatter_class=argparse.RawDescriptionHelpFormatter)