2016-03-25 12 views
1

Я работаю в процедуре FEA (конечный элементный анализ) внутри Rhino/Grasshopper с использованием C#. У меня есть строки (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-дерево или R-дерево для такого рода вещей. Затем вы можете использовать это как для индексации, так и для дублирования. , например. https://github.com/codeandcats/KdTree (не используется это сам, но это правильная вещь)

+1

У Rhinocommon есть R-деревья, построенные в: http://developer.rhino3d.com/samples/rhinocommon/rtreeclosestpoint/ – Goswin

+0

Ницца, я не пробовал это. –