protected AbstractPosMappingScanNode(PosMapper2 posMapper, IList <IDScanItem> leftBorderScan, IList <IDScanItem> rightBorderScan) { PosMapper = posMapper; LeftBorderScan = leftBorderScan; RightBorderScan = rightBorderScan; ItemsOnScan = rightBorderScan.Without(leftBorderScan).ToList(); }
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); } }
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)); }
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) } }