Exemplo n.º 1
0
        internal static RectangleNode <Polyline> ReplaceTightObstaclesWithConvexHulls(Set <Polyline> tightObsts, IEnumerable <Tuple <Polyline, Polyline> > overlappingPairSet)
        {
            var overlapping = new Set <Polyline>();

            foreach (var pair in overlappingPairSet)
            {
                overlapping.Insert(pair.Item1);
                overlapping.Insert(pair.Item2);
            }
            var intToPoly = overlapping.ToArray();
            var polyToInt = MapToInt(intToPoly);
            var graph     = new BasicGraph <IntPair>(
                overlappingPairSet.
                Select(pair => new IntPair(polyToInt[pair.Item1], polyToInt[pair.Item2])));
            var connectedComponents = ConnectedComponentCalculator <IntPair> .GetComponents(graph);

            foreach (var component in connectedComponents)
            {
                var polys      = component.Select(i => intToPoly[i]);
                var points     = polys.SelectMany(p => p);
                var convexHull = ConvexHull.CreateConvexHullAsClosedPolyline(points);
                foreach (var poly in polys)
                {
                    tightObsts.Remove(poly);
                }
                tightObsts.Insert(convexHull);
            }
            return(CalculateHierarchy(tightObsts));
        }
Exemplo n.º 2
0
        private bool CreateConvexHulls()
        {
            var found = false;
            var graph = new BasicGraph <IntPair>(this.overlapPairs);
            var connectedComponents = ConnectedComponentCalculator <IntPair> .GetComponents(graph);

            foreach (var component in connectedComponents)
            {
                // GetComponents returns at least one self-entry for each index - including the < FirstNonSentinelOrdinal ones.
                if (component.Count() == 1)
                {
                    continue;
                }

                found = true;
                var obstacles = component.Select(this.OrdinalToObstacle);
                var points    = obstacles.SelectMany(obs => obs.VisibilityPolyline);
                var och       = new OverlapConvexHull(ConvexHull.CreateConvexHullAsClosedPolyline(points), obstacles);
                foreach (var obstacle in obstacles)
                {
                    obstacle.SetConvexHull(och);
                }
            }
            return(found);
        }
        private static void GrowGroupAroundLoosePolyline(Obstacle group, Polyline loosePolyline)
        {
            var points = group.VisibilityPolyline.Select(p => p).Concat(loosePolyline.Select(p => p));

            group.SetConvexHull(new OverlapConvexHull(ConvexHull.CreateConvexHullAsClosedPolyline(points), new[] { group }));
        }