2017-07-26 2 views
-4

J'essaie de supprimer une liste de visages ainsi que leurs sommets respectifs (s'ils ne sont plus référencés) d'un maillage, mais jusqu'ici je n'ai pu pour supprimer avec succès la liste des visages. L'idée est que pour chaque indice qui est supprimé, tous les indices plus grands que celui qui est supprimé doivent être décrémentés de 1.Comment supprimer une liste de visages et ses sommets d'un maillage

Le maillage est représenté simplement par une liste de sommets et une liste d'indices (et éventuellement une liste de Triangles).

Actuellement, le code pour supprimer quelques triangles Est-ce:

private IMesh DeleteTriangles(IMesh input, IEnumerable<int> indices_to_delete) 
    { 
     var triangles_to_delete = new HashSet<int>(indices_to_delete); 

     _triangles_to_keep = _mesh.Triangles.Where((t, count) => 
      !triangles_to_delete.Contains(t.A) && 
      !triangles_to_delete.Contains(t.B) && 
      !triangles_to_delete.Contains(t.C)).ToList(); 

     // return new mesh 
    } 

Répondre

0

La solution que je suis venu avec à la fin:

public IMesh DeleteVertices(IMesh mesh, IImmutableList<int> indices_to_remove) 
    { 
     var indices_to_remove_set = new HashSet<int>(indices_to_remove); 
     var new_vertices = new List<Vector>(); 
     var map = new int[mesh.Vertices.Count]; 

     for (var i = 0; i < mesh.Vertices.Count; i++) 
     { 
      if (indices_to_remove_set.Contains(i)) 
      { 
       map[i] = -1; 
      } 
      else 
      { 
       new_vertices.Add(mesh.Vertices[i]); 
       map[i] = new_vertices.Count - 1; 
      } 
     } 

     var new_triangle_list = from triangle in mesh.Triangles 
           where map[triangle.A] != -1 && 
             map[triangle.B] != -1 && 
             map[triangle.C] != -1 
           select new IndexTriangle(
            map[triangle.A], 
            map[triangle.B], 
            map[triangle.C]); 

     //build new mesh... 
    }