Segment class

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

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

Поля (9)

МодификаторыТипИмя
public static final MultiMixDensity.Segment.GaugeSegmentComparator INSTANCE
private final MultiMixDensity.Key key0
private final MultiMixDensity.Key key1
private final double magnitude
double var10
double var12
double var4
double var6
double var8

Методы (8)

МодификаторыВозвратСигнатура
public GaugeSegmentComparatorpublic GaugeSegmentComparator()
public Integer applypublic Integer apply(Double var1, @Nonnull MultiMixDensity.Segment var2)
public boolean containspublic boolean contains(double var1)
public double getValuepublic double getValue(@Nonnull Density.Context var1, double var2)
if if(var8 == 0.0)
if if(var8 == 1.0)
if if(this.key0.density == this.key1.density)
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;
            }
         }
      }
   }
}