2016-03-25 7 views
1

私はC#を使用しているRhino/Grasshopper内部のFEA(有限要素解析)手順で作業しています。私は入力として線(FDs)とメッシュの三角面(NFDs)を持っていて、それぞれがノード座標を持っています。私はこれらの座標を取得し、各ノードをインデックスするためのリストでそれらを再開しようとしています。線として座標からのノードのインデックス

とメッシュ面は私が重複する情報を避けようとして次のことをやった同じノードを共有することができます。私は、プロジェクトをビルドするとき

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

入力データを再度チェックして、ラインノードが実際に選択した許容誤差で一致していることを確認してください。

大規模なポイントセット(1000sのノード)では、あなたのアプローチは非常に遅いので、この種のものにはkd-treeまたはR-treeをお勧めします。インデックス作成と重複カリングの両方にこれを使用できます。例: https://github.com/codeandcats/KdTree(これは自分では使用しませんが、それは正しい種類のものです)

+1

RhinocommonにはR-Treesが組み込まれています:http://developer.rhino3d.com/samples/rhinocommon/rtreeclosestpoint/ – Goswin

+0

ニース、私はそれを計時していませんでした。 –

関連する問題