diff --git a/client/src/main/java/ru/trader/controllers/PowerPlayController.java b/client/src/main/java/ru/trader/controllers/PowerPlayController.java index a91c5fa..f7bb83f 100644 --- a/client/src/main/java/ru/trader/controllers/PowerPlayController.java +++ b/client/src/main/java/ru/trader/controllers/PowerPlayController.java @@ -232,6 +232,14 @@ public class PowerPlayController { } } + private void getMaxIntersect(){ + Collection controlls = getControlSystems(); + result.clear(); + if (!controlls.isEmpty()){ + Collection intersect = analyzator.getMaxIntersect(controlls); + result.addAll(BindingsHelper.observableList(intersect, ResultEntry::new)); + } + } @FXML private void currentAsChecked(){ @@ -266,6 +274,9 @@ public class PowerPlayController { if (rbExpansions.isSelected()){ getNearExpansions(); } + if (rbMaxIntersect.isSelected()){ + getMaxIntersect(); + } } diff --git a/core/src/main/java/ru/trader/analysis/PowerPlayAnalyzator.java b/core/src/main/java/ru/trader/analysis/PowerPlayAnalyzator.java index 6aa7b97..3265a70 100644 --- a/core/src/main/java/ru/trader/analysis/PowerPlayAnalyzator.java +++ b/core/src/main/java/ru/trader/analysis/PowerPlayAnalyzator.java @@ -44,9 +44,14 @@ public class PowerPlayAnalyzator { return getIntersects(starSystem, candidates, starSystems, Market.CONTROLLING_RADIUS).collect(Collectors.toList()); } + public Collection getMaxIntersect(Collection starSystems){ + Stream candidates = market.get().stream().filter(p -> p.getFaction() != FACTION.NONE); + return getMaxIntersect(candidates, starSystems, Market.CONTROLLING_RADIUS).collect(Collectors.toList()); + } + public Collection getNear(Collection starSystems){ Stream candidates = market.get().stream().filter(p -> p.getFaction() != FACTION.NONE); - return getNear(candidates, starSystems, Market.CONTROLLING_RADIUS, Market.CONTROLLING_RADIUS*2).collect(Collectors.toList()); + return getNear(candidates, starSystems, Market.CONTROLLING_RADIUS, Market.CONTROLLING_RADIUS * 2).collect(Collectors.toList()); } public Collection getNearExpansions(Collection starSystems){ @@ -95,6 +100,37 @@ public class PowerPlayAnalyzator { .sorted(new DistanceComparator()); } + public static Stream getMaxIntersect(Stream starSystems, Collection centers, double radius){ + IntersectsMapper distanceMapper = new IntersectsMapper(centers, radius*2, false, true); + Predicate isControlling = intersectsAnyPredicate(centers, radius); + Collection candidates = new ArrayList<>(); + Collection checked = new ArrayList<>(); + starSystems.filter(new FarDropper(centers, radius*2)) + .forEach(p -> { + if (isControlling != null && isControlling.test(p)) checked.add(p); + else { + if (p.getPower() == POWER.NONE) { + candidates.add(p); + } + } + }); + candidates.removeAll(centers); + IntersectsMapper checkedMapper = new IntersectsMapper(checked, radius, false, true); + return candidates.stream() + .map(checkedMapper) + .filter(IntersectData::isIntersect) + .sorted((d1, d2) -> { + long pop1 = d1.getControllingSystems().stream().mapToLong(d -> d.center.getPopulation()).sum(); + long pop2 = d2.getControllingSystems().stream().mapToLong(d -> d.center.getPopulation()).sum(); + int cmp = Long.compare(pop2, pop1); + if (cmp == 0) cmp = Integer.compare(d2.getCount(), d1.getCount()); + return cmp; + }) + .map(IntersectData::getStarSystem) + .map(distanceMapper) + .filter(IntersectData::isIntersect); + } + public static Collection getNearExpansions(Collection starSystems, Collection centers, double maxDistance){ return getNearExpansions(starSystems.stream(), centers, maxDistance).collect(Collectors.toList()); }