public static List <PointIndex> CullClosestPoints(List <Point3d> points, List <RFNode> existingNodes, ref int lastNodeIndex, double tol) { var outPoints = new List <PointIndex>(); BoundingBox empty = BoundingBox.Empty; // Create PointIndexes var existingPointIndices = new List <PointIndex>(points.Count); for (int i = 0; i < existingNodes.Count; i++) { PointIndex pointIndex = new PointIndex(); pointIndex.Index = existingNodes[i].No; pointIndex.Point = existingNodes[i].Location; existingPointIndices.Add(pointIndex); empty.Union(pointIndex.Point); } var list2 = new List <PointIndex>(points.Count); for (int i = 0; i < points.Count; i++) { PointIndex pointIndex = new PointIndex(); pointIndex.Index = -1; pointIndex.Point = points[i]; list2.Add(pointIndex); empty.Union(pointIndex.Point); } empty.Inflate(tol); Node3d <PointIndex> val = new Node3d <PointIndex>((Coordinates3d <PointIndex>)PointIndexCoordinates, empty, 30); int firstItem = 0; if (existingNodes.Count > 0) { val.AddRange(existingPointIndices); // list to compare points to } else { var node = list2[0]; node.Index = 1; firstItem = 1; lastNodeIndex = 1; val.Add(node); // list to compare points to outPoints.Add(node); } for (int j = firstItem; j <= list2.Count - 1; j++) { PointIndex pointIndex2 = list2[j]; while (true) { Index3d <PointIndex> val2 = val.NearestItem(pointIndex2); if (val2 == null) { lastNodeIndex++; pointIndex2.Index = lastNodeIndex; val.Add(pointIndex2); outPoints.Add(pointIndex2); break; } PointIndex item = val2.Item; double num4 = pointIndex2.Point.DistanceTo(item.Point); if (num4 > tol || double.IsNaN(num4)) { lastNodeIndex++; pointIndex2.Index = lastNodeIndex; val.Add(pointIndex2); outPoints.Add(pointIndex2); break; } pointIndex2.Point = Point3d.Unset; pointIndex2.Index = val2.Item.Index; outPoints.Add(pointIndex2); break; } List <PointIndex> itemsGlobal = val.ItemsGlobal; } return(outPoints); }