Пример #1
0
        protected AbstractPosMappingScanNode(PosMapper2 posMapper, IList <IDScanItem> leftBorderScan,
                                             IList <IDScanItem> rightBorderScan)
        {
            PosMapper       = posMapper;
            LeftBorderScan  = leftBorderScan;
            RightBorderScan = rightBorderScan;

            ItemsOnScan = rightBorderScan.Without(leftBorderScan).ToList();
        }
Пример #2
0
        public DefaultPosMappingScanNode(PosMapper2 posMapper, IList <IGrouping <long, IDScanItem> > moonGroups,
                                         IList <IDScanItem> leftBorderScan, IList <IDScanItem> rightBorderScan)
            : base(posMapper, leftBorderScan, rightBorderScan)
        {
            _moonGroups = moonGroups;

            var towerCount = ItemsOnScan.Count(PosMappingUtils.IsTower);

            IsLeaf = towerCount == 0 || (towerCount == 1 && moonGroups.Count < 2);

            if (!IsLeaf)
            {
                PivotalScanRangeInKm =
                    PosMappingUtils.GetLowerBoundInKm(_moonGroups.Skip(_moonGroups.Count / 2).First().First().Distance);
            }
        }
Пример #3
0
        private static IPosMappingScanNode CreateNode(PosMapper2 posMapper, IList <IDScanItem> leftBorderItems,
                                                      IList <IDScanItem> rightBorderItems)
        {
            var itemsAtNode = rightBorderItems.Without(leftBorderItems).ToList();
            var moonGroups  = PosMappingUtils.GetMoonGroups(itemsAtNode);

            if (IsCluster(moonGroups))
            {
                var moonGroup = moonGroups.First().First();

                return(new MoonClusterNode(posMapper, PosMappingUtils.GetLowerBoundInKm(moonGroup.Distance),
                                           PosMappingUtils.GetUpperBoundInKm(moonGroup.Distance), leftBorderItems,
                                           rightBorderItems));
            }

            return(new DefaultPosMappingScanNode(posMapper, moonGroups, leftBorderItems, rightBorderItems));
        }
Пример #4
0
        public MoonClusterNode(PosMapper2 posMapper, long lowerBoundaryInKm, long upperBoundaryInKm,
                               IList <IDScanItem> leftBorderScan, IList <IDScanItem> rightBorderScan)
            : base(posMapper, leftBorderScan, rightBorderScan)
        {
            _upperBoundaryInKm = upperBoundaryInKm;
            _lowerBoundaryInKm = lowerBoundaryInKm;

            _sizeInKm            = upperBoundaryInKm - lowerBoundaryInKm;
            PivotalScanRangeInKm = upperBoundaryInKm - _sizeInKm / 2;

            var towerCount = ItemsOnScan.Count(PosMappingUtils.IsTower);

            if (IsClusterTooDense)
            {
                IsLeaf = true;
                PosMapper.OnMoonClusterIsTooDense(ItemsOnScan.Where(PosMappingUtils.IsMoon).ToList());
                //TODO on dings nicht public machen, sondern actions uebergeben oder so
            }
            else
            {
                IsLeaf = towerCount == 0 ||
                         (towerCount == 1 && ItemsOnScan.Count(PosMappingUtils.IsMoon) == 1);//TODO extension method fuer count == 1 (kann bei 2 abbrechen)
            }
        }