GaugeSegmentComparator class

Пакет: com.hypixel.hytale.builtin.hytalegenerator.density

Файл: com/hypixel/hytale/builtin/hytalegenerator/density/MultiMixDensity.java

implements: BiFunction<Double, MultiMixDensity.Segment, Integer>

Поля (1)

МодификаторыТипИмя
public static final MultiMixDensity.Segment.GaugeSegmentComparator INSTANCE

Методы (2)

МодификаторыВозвратСигнатура
public Integer applypublic Integer apply(Double var1, @Nonnull MultiMixDensity.Segment var2)
if if(var1 < var2.key0.value)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.density;

class="kw">import com.hypixel.hytale.builtin.hytalegenerator.ArrayUtil;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.math.Interpolation;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Comparator;
class="kw">import java.util.List;
class="kw">import java.util.function.BiFunction;
class="kw">import javax.annotation.Nonnull;

class="kw">public class MultiMixDensity class="kw">extends Density {
   @Nonnull
   class="kw">private class="kw">final List<MultiMixDensity.Segment> segments;
   class="kw">private class="kw">final double min;
   class="kw">private class="kw">final double max;
   class="kw">private class="kw">final Density firstDensity;
   class="kw">private class="kw">final Density lastDensity;
   class="kw">private Density influenceDensity;

   class="kw">public MultiMixDensity(@Nonnull List<MultiMixDensity.Key> var1, @Nonnull Density var2) {
      if (var1.size() < 2) {
         throw new IllegalArgumentException("must have at least two keys");
      }

      var1.sort(Comparator.comparingDouble(var0 -> var0.value));
      if (!isKeysUnique(var1)) {
         throw new IllegalArgumentException("Duplicate keys provided.");
      }

      this.segments = new ArrayList<>(var1.size() - 1);

      for (int var3 = 1; var3 < var1.size(); var3++) {
         MultiMixDensity.Key var4 = var1.get(var3 - 1);
         MultiMixDensity.Key var5 = var1.get(var3);
         this.segments.add(new MultiMixDensity.Segment(var4, var5));
      }

      this.min = var1.getFirst().value;
      this.max = var1.getLast().value;
      this.firstDensity = var1.getFirst().density;
      this.lastDensity = var1.getLast().density;
      this.influenceDensity = var2;
   }

   @Override
   class="kw">public double process(@Nonnull Density.Context var1) {
      double var2 = this.influenceDensity.process(var1);
      if (var2 <= this.min) {
         class="kw">return this.firstDensity.process(var1);
      } else if (var2 >= this.max) {
         class="kw">return this.lastDensity.process(var1);
      } else {
         int var4 = ArrayUtil.sortedSearch(this.segments, var2, MultiMixDensity.Segment.GaugeSegmentComparator.INSTANCE);
         if (var4 == -1) {
            assert false : "should never get here";
            class="kw">return 0.0;
         } else {
            class="kw">return this.segments.get(var4).getValue(var1, var2);
         }
      }
   }

   @Override
   class="kw">public void setInputs(@Nonnull Density[] var1) {
      if (var1.length != 1) {
         throw new IllegalArgumentException("inputs.length != 1");
      }

      this.influenceDensity = var1[0];
   }

   class="kw">public class="kw">static boolean isKeysUnique(@Nonnull List<MultiMixDensity.Key> var0) {
      for (int var1 = 1; var1 < var0.size(); var1++) {
         if (var0.get(var1).value == var0.get(var1 - 1).value) {
            class="kw">return false;
         }
      }

      class="kw">return true;
   }

   class="kw">public record Key(double value, Density density) {
      class="kw">public Key {
      }
   }

   class="kw">private class="kw">static class Segment {
      @Nonnull
      class="kw">private class="kw">final MultiMixDensity.Key key0;
      @Nonnull
      class="kw">private class="kw">final MultiMixDensity.Key key1;
      class="kw">private class="kw">final double magnitude;

      class="kw">public Segment(@Nonnull MultiMixDensity.Key var1, @Nonnull MultiMixDensity.Key var2) {
         assert var1.value < var2.value : "key0 should be smaller than key1";
         this.key0 = var1;
         this.key1 = var2;
         this.magnitude = var2.value - var1.value;
      }

      class="kw">public boolean contains(double var1) {
         class="kw">return var1 >= this.key0.value && var1 <= this.key1.value;
      }

      class="kw">public double getValue(@Nonnull Density.Context var1, double var2) {
         assert var2 >= this.key0.value && var2 <= this.key1.value : "mix outside range";
         double var4 = 0.0;
         double var6 = 1.0;
         double var8 = (var2 - this.key0.value) / this.magnitude;
         if (var8 == 0.0) {
            class="kw">return this.key0.density.process(var1);
         }

         if (var8 == 1.0) {
            class="kw">return this.key1.density.process(var1);
         }

         if (this.key0.density == this.key1.density) {
            class="kw">return this.key0.density.process(var1);
         }

         double var10 = this.key0.density.process(var1);
         double var12 = this.key1.density.process(var1);
         class="kw">return Interpolation.linear(var10, var12, var8);
      }

      class="kw">public class="kw">static class GaugeSegmentComparator class="kw">implements BiFunction<Double, MultiMixDensity.Segment, Integer> {
         @Nonnull
         class="kw">public class="kw">static class="kw">final MultiMixDensity.Segment.GaugeSegmentComparator INSTANCE = new MultiMixDensity.Segment.GaugeSegmentComparator();

         class="kw">public GaugeSegmentComparator() {
         }

         @Nonnull
         class="kw">public Integer apply(Double var1, @Nonnull MultiMixDensity.Segment var2) {
            if (var1 < var2.key0.value) {
               class="kw">return -1;
            } else {
               class="kw">return var1 >= var2.key1.value ? 1 : 0;
            }
         }
      }
   }
}