I have a triangle list, that has XYZ cooridnates per triangle node. I need a list of nodes and a list of triangle node indices from that. Close nodes should get the same index.
My C# code is:
// ensureNodeAt
// return node index. Avoid duplicates.
public int ensureNodeAt(XYZ p, double eps_dist = 1e-9)
{
// backwards - most likely the one we seek is at the back
for (int i = nodes.Count - 1; i >= 0; --i)
{
XYZ v = nodes[i].v - p;
// dx = v.X - p.X;
// dy = v.Y - p.Y;
// dz = v.Z - p.Z;
// dx = dx * dx + dy * dy + dz * dz;
if (v.X * v.X + v.Y * v.Y + v.Z * v.Z < eps_dist)
{ return i; }
}
// Must add a new node
nodes.Add(p);
return nodes.Count - 1;
}
void work(List<XYZ> triangles){
tri = new List<Tri>(triangles.Count / 3); // triangle indices
nodes = new List<XYZ>(triangles.Count); // triangle nodes
for (int i = 0; i < triangles.Count; i += 3)
{
var a = triangles[i];
var b = triangles[i + 1];
var c = triangles[i + 2];
tri.Add(new Tri(ensureNodeAt(a, eps_dist), ensureNodeAt(b, eps_dist), ensureNodeAt(c, eps_dist)));
}
}
Is there any way to make this faster or run in parallel? I have like 900k of nodes.