【问题标题】:Node indexing from coordinates从坐标索引节点
【发布时间】:2016-03-25 14:54:18
【问题描述】:

我正在使用 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 之间])。

我该如何解决?

谢谢,

马尔西奥

【问题讨论】:

  • 你是怎么做到的?

标签: c# finite-element-analysis node-set grasshopper rhino3d


【解决方案1】:

如果您有比预期更多的节点,那么我将首先检查来自Point3d.CullDuplicates 的输出以确保它看起来合理。即放置一个断点并检查coordf

还要仔细检查您的输入数据,以确保线节点对于您选择的容差确实重合。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多