2016-03-25 52 views
1

我正在使用C#在Rhino/Grasshopper内的FEA(有限元分析)过程中工作。我有线(FD)和网格三角面(NFD)作为输入,每个都有它们的节点坐标。我试图获取这些坐标并将它们恢复到列表中以索引每个节点。从坐标节点索引

由于线和网格面可以分享我做了以下努力避免重复信息相同的节点:

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; 
      } 
     } 
    } 

然而,当我建立的项目,我仍然收到重复的信息。网格面临重复消失,但代码复制行的索引。 (例如,一个9节点问题给我13个节点,有时候是14或15个。查看网格索引,所有东西都在9以下,但是不在9和13之间)。

我该如何解决这个问题?

感谢,

马西奥

+0

你是怎么做到的? –

回答

1

如果你有比预期的话,我会先检查从Point3d.CullDuplicates输出,以确保它看起来明智的多个节点。即将断点放入并检查coordf

同时仔细检查输入数据以确保线节点确实与您选择的容差一致。

一般而言,对于大点集(1000个节点),您的方法将会非常缓慢,所以我会推荐一个kd-tree或R-tree用于这种事情。然后,您可以将它用于索引和重复剔除。 例如https://github.com/codeandcats/KdTree(这个我自己没有用过,但它是正确的东西)

+1

Rhinocommon内置了R-Trees:http://developer.rhino3d.com/samples/rhinocommon/rtreeclosestpoint/ – Goswin

+0

不错,我没有记时。 –