Exemplo n.º 1
0
        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);
        }