MultiMixDensity class
Пакет: com.hypixel.hytale.builtin.hytalegenerator.density
Файл: com/hypixel/hytale/builtin/hytalegenerator/density/MultiMixDensity.java
extends: Density
Поля (13)
| Модификаторы | Тип | Имя |
|---|---|---|
|
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 |
var2 |
|
MultiMixDensity.Key |
var4 |
|
int |
var4 |
|
double |
var4 |
|
MultiMixDensity.Key |
var5 |
|
double |
var6 |
|
double |
var8 |
Методы (19)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public |
GaugeSegmentComparatorpublic GaugeSegmentComparator() |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("must have at least two keys") |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Duplicate keys provided.") |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("inputs.length != 1") |
public |
record |
Keyrecord Key(double value, Density density) |
|
public |
Segmentpublic Segment(@Nonnull MultiMixDensity.Key var1, @Nonnull MultiMixDensity.Key var2) |
|
public Integer |
applypublic Integer apply(Double var1, @Nonnull MultiMixDensity.Segment var2) |
|
public boolean |
containspublic boolean contains(double var1) |
abstract |
|
for for(int var3 = 1; var3 < var1.size() |
abstract |
|
for for(int var1 = 1; var1 < var0.size() |
|
public double |
getValuepublic double getValue(@Nonnull Density.Context var1, double var2) |
|
|
if if(var2 <= this.min) |
|
|
if if(var4 == -1) |
|
|
if if(var1.length != 1) |
|
|
if if(var8 == 0.0) |
|
|
if if(var8 == 1.0) |
|
|
if if(this.key0.density == this.key1.density) |
|
|
if if(var1 < var2.key0.value) |
static |
boolean |
isKeysUniqueboolean isKeysUnique(@Nonnull List<MultiMixDensity.Key> var0) |
Исходный код
Показать/скрыть
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;
}
}
}
}
}