我正在使用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(我自己没有使用它,但这是正确的事情)