2016-07-05 2 views
1

У меня есть треугольная сетка с высоким разрешением с примерно 2 миллионами треугольников. Я хочу уменьшить количество треугольников и вершин примерно до ~ 10000 каждый, сохраняя при этом общую форму.mesh decimation in python

Я знаю, что это можно сделать в Matlab, используя сокращение. Другой альтернативой является пакет qslim. Также в VTK есть функция прореживания, которая имеет интерфейс python, поэтому технически это возможно и в python. Meshlab, вероятно, доступен и на python (?).

Как я могу сделать такое прореживание сетки в python? Примеры были бы весьма полезны.

+2

возможно с этим примером? это не в python, но его легко перевести http://www.vtk.org/Wiki/VTK/Examples/Cxx/Meshes/Decimation – MrPedru22

+0

yep, я видел это, но это нелегко перевести для меня с тех пор Я всего лишь новичок. Любая помощь будет принята с благодарностью. – AnandJ

ответ

2

Вот минимальный прототип python, переведенный из его эквивалентного примера vtk C++ (http://www.vtk.org/Wiki/VTK/Examples/Cxx/Meshes/Decimation), так как MrPedru22 хорошо предложен.

from vtk import (vtkSphereSource, vtkPolyData, vtkDecimatePro) 


def decimation(): 
    sphereS = vtkSphereSource() 
    sphereS.Update() 

    inputPoly = vtkPolyData() 
    inputPoly.ShallowCopy(sphereS.GetOutput()) 

    print("Before decimation\n" 
      "-----------------\n" 
      "There are " + str(inputPoly.GetNumberOfPoints()) + "points.\n" 
      "There are " + str(inputPoly.GetNumberOfPolys()) + "polygons.\n") 

    decimate = vtkDecimatePro() 
    decimate.SetInputData(inputPoly) 
    decimate.SetTargetReduction(.10) 
    decimate.Update() 

    decimatedPoly = vtkPolyData() 
    decimatedPoly.ShallowCopy(decimate.GetOutput()) 

    print("After decimation \n" 
      "-----------------\n" 
      "There are " + str(decimatedPoly.GetNumberOfPoints()) + "points.\n" 
      "There are " + str(decimatedPoly.GetNumberOfPolys()) + "polygons.\n") 


if __name__ == "__main__": 
    decimation()