2016-03-25 3 views
1

Je travaille sur une procédure FEA (analyse par éléments finis) dans Rhino/Grasshopper en utilisant C#. J'ai des lignes (FD) et des faces triangulaires (NFD) en entrée, chacune avec leurs coordonnées de nœuds. J'essaie d'obtenir ces coordonnées et de les reprendre dans une liste pour indexer chaque nœud.Indexation des nœuds à partir des coordonnées

Comme les lignes de maillage et visages peuvent partager les mêmes nœuds que j'ai fait ce qui suit en essayant d'éviter les informations en double:

public void NodeIndex() 
    { 
     List<Point3d> coord = new List<Point3d>(); 
     //Add all nodes 
     foreach (NFD nfdens in nfd) 
     { 
      foreach (Node node in nfdens.nodes) 
      { 
       coord.Add(node.point); 
      } 
     } 
     foreach (FD fdens in fd) 
     { 
      foreach (Node node in fdens.nodes) 
      { 
       coord.Add(node.point); 
      } 
     } 

     //Remove Duplicates 
     // 0.1 Stands for distance tolerance 
     Point3d[] coordf = Point3d.CullDuplicates(coord, 0.1); 
     coord = new List<Point3d>(); 
     foreach (Point3d pt in coordf) 
     { 
      coord.Add(pt); 
     } 

     //Set indexes 
     int id = 0; 
     foreach (Point3d pt in coordf) 
     { 
      nodes.Add(new Node(pt, id)); 
      id++; 
     } 
     foreach (NFD nfdens in nfd) 
     { 
      foreach (Node node in nfdens.nodes) 
      { 
       node.SetIndex(nodes); 
      } 
     } 
     foreach (FD fdens in fd) 
     { 
      foreach (Node node in fdens.nodes) 
      { 
       node.SetIndex(nodes); 
      } 
     } 
     foreach (Pload load in pointload) 
     { 
      load.node.SetIndex(nodes); 
     } 
     foreach (Supp sup in supports) 
     { 
      sup.node.SetIndex(nodes); 
     } 
    } 

    public void SetIndex(List<Node> nodes) 
    { 
     foreach (Node node in nodes) 
     { 
      double dist = point.DistanceTo(node.point); 
      if (dist < 0.1) 
      { 
       index = node.index; 
      } 
     } 
    } 

Cependant, quand je construis le projet que je reçois encore des informations en double. Les doublons de faces maillées ont disparu, mais le code duplique les index des lignes. (Par exemple, un problème de 9 nœuds me donne 13 nœuds, parfois 14 ou 15. En regardant les index des mailles, tout est sous 9, mais dans les lignes pas [sont entre 9 et 13]).

Comment puis-je résoudre ce problème?

Merci,

Márcio

+0

Comment est-ce que tu t'entends? –

Répondre

1

Si vous avez plus de noeuds que prévu alors je voudrais tout d'abord vérifier la sortie de Point3d.CullDuplicates pour vous assurer qu'il semble raisonnable. c'est-à-dire mettre un point d'arrêt dans et inspecter coordf

Vérifiez également vos données d'entrée pour vous assurer que les nœuds de ligne coïncident réellement avec la tolérance choisie.

En général votre approche va être très lente pour les grands ensembles de points (1000s de nœuds), donc je recommanderais un kd-tree ou un R-tree pour ce genre de chose. Vous pouvez ensuite utiliser ceci pour l'indexation et l'élimination des doublons. par exemple. https://github.com/codeandcats/KdTree (pas utilisé moi-même mais c'est le bon type de chose)

+1

Rhinocommon a R-arbres intégrés: http://developer.rhino3d.com/samples/rhinocommon/rtreeclosestpoint/ – Goswin

+0

Nice, je n'avais pas cadencé cela. –