DistanceTransform class
Пакет: com.hypixel.hytale.server.worldgen.climate.util
Файл: com/hypixel/hytale/server/worldgen/climate/util/DistanceTransform.java
Поля (31)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
IntArrayList |
EMPTY_LIST |
|
|
break |
|
int |
var11 |
|
int |
var12 |
|
int |
var14 |
|
int |
var15 |
|
int |
var16 |
|
int |
var17 |
|
int |
var18 |
|
int |
var19 |
|
int |
var21 |
|
int |
var22 |
|
int |
var23 |
|
int |
var24 |
|
double |
var25 |
|
double[] |
var27 |
|
PriorityQueue |
var28 |
|
ObjectIterator |
var29 |
|
Entry |
var30 |
|
int |
var31 |
|
IntArrayList |
var32 |
|
IntArrayList |
var33 |
|
DistanceTransform.Node |
var35 |
|
int |
var38 |
|
int |
var39 |
|
int |
var4 |
|
double |
var40 |
|
int |
var5 |
|
int |
var6 |
|
Int2ObjectOpenHashMap |
var7 |
|
Int2ObjectOpenHashMap |
var8 |
Методы (16)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("radius must be > 0") |
private |
record |
Noderecord Node(int index, double distance) |
static |
void |
applyvoid apply(@Nonnull IntMap var0, @Nonnull DoubleMap var1, double var2) |
|
|
for for(int var9 = 0; var9 < var5; var9++) |
|
|
for for(int var10 = 0; var10 < var4; var10++) |
|
|
for for(int var13 = 0; var13 < 4; var13++) |
|
|
for for(int var20 = 0; var20 < DX.length; var20++) |
abstract |
|
for for(int var37 = 0; var37 < var32.size() |
abstract |
|
for for(int var34 = 0; var34 < var33.size() |
abstract |
|
for for(int var36 = 0; var36 < var32.size() |
|
|
if if(var2 <= 0.0) |
|
|
if if(var14 >= 0 && var14 < var4 && var15 >= 0 && var15 < var5) |
|
|
if if(var21 >= 0 && var21 < var4 && var22 >= 0 && var22 < var5) |
|
|
if if(var24 == var31) |
|
|
if if(var25 < var27[var23]) |
|
public static int |
sortpublic static int sort(DistanceTransform.Node var0, DistanceTransform.Node var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.worldgen.climate.util;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.ints.IntArrayList;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import java.util.Arrays;
class="kw">import java.util.PriorityQueue;
class="kw">import javax.annotation.Nonnull;
class="kw">public class DistanceTransform {
class="kw">private class="kw">static class="kw">final IntArrayList EMPTY_LIST = new IntArrayList();
class="kw">private class="kw">static class="kw">final int[] DX = new int[]{-1, 1, 0, 0, -1, -1, 1, 1};
class="kw">private class="kw">static class="kw">final int[] DY = new int[]{0, 0, -1, 1, -1, 1, -1, 1};
class="kw">private class="kw">static class="kw">final double[] COST = new double[]{1.0, 1.0, 1.0, 1.0, Math.sqrt(2.0), Math.sqrt(2.0), Math.sqrt(2.0), Math.sqrt(2.0)};
class="kw">public DistanceTransform() {
}
class="kw">public class="kw">static void apply(@Nonnull IntMap var0, @Nonnull DoubleMap var1, double var2) {
if (var2 <= 0.0) {
throw new IllegalArgumentException("radius must be > 0");
}
int var4 = var0.width;
int var5 = var0.height;
int var6 = var4 * var5;
Int2ObjectOpenHashMap var7 = new Int2ObjectOpenHashMap();
Int2ObjectOpenHashMap var8 = new Int2ObjectOpenHashMap();
for (int var9 = 0; var9 < var5; var9++) {
for (int var10 = 0; var10 < var4; var10++) {
int var11 = var0.index(var10, var9);
int var12 = var0.at(var11);
((IntArrayList)var7.computeIfAbsent(var12, var0x -> new IntArrayList())).add(var11);
for (int var13 = 0; var13 < 4; var13++) {
int var14 = var10 + DX[var13];
int var15 = var9 + DY[var13];
if (var14 >= 0 && var14 < var4 && var15 >= 0 && var15 < var5) {
int var16 = var0.index(var14, var15);
if (var0.at(var16) != var12) {
((IntArrayList)var8.computeIfAbsent(var12, var0x -> new IntArrayList())).add(var11);
break;
}
}
}
}
}
double[] var27 = new double[var6];
PriorityQueue var28 = new PriorityQueue<>(DistanceTransform.Node::sort);
ObjectIterator var29 = var7.int2ObjectEntrySet().iterator();
while (var29.hasNext()) {
Entry var30 = (Entry<IntArrayList>)var29.next();
int var31 = var30.getIntKey();
IntArrayList var32 = (IntArrayList)var30.getValue();
IntArrayList var33 = (IntArrayList)var8.getOrDefault(var31, EMPTY_LIST);
if (var33.isEmpty()) {
for (int var37 = 0; var37 < var32.size(); var37++) {
var1.set(var32.getInt(var37), 1.0);
}
} else {
Arrays.fill(var27, var2);
for (int var34 = 0; var34 < var33.size(); var34++) {
int var17 = var33.getInt(var34);
var27[var17] = 0.0;
var28.offer(new DistanceTransform.Node(var17, 0.0));
}
while (!var28.isEmpty()) {
DistanceTransform.Node var35 = var28.poll();
int var38 = var35.index;
if (!(var35.distance > var27[var38])) {
int var18 = var38 % var4;
int var19 = var38 / var4;
for (int var20 = 0; var20 < DX.length; var20++) {
int var21 = var18 + DX[var20];
int var22 = var19 + DY[var20];
if (var21 >= 0 && var21 < var4 && var22 >= 0 && var22 < var5) {
int var23 = var0.index(var21, var22);
int var24 = var0.at(var23);
if (var24 == var31) {
double var25 = var35.distance + COST[var20];
if (var25 < var27[var23]) {
var27[var23] = var25;
var28.offer(new DistanceTransform.Node(var23, var25));
}
}
}
}
}
}
for (int var36 = 0; var36 < var32.size(); var36++) {
int var39 = var32.getInt(var36);
double var40 = MathUtil.clamp(var27[var39], 0.0, var2);
var1.set(var39, var40 / var2);
}
}
}
}
class="kw">private record Node(int index, double distance) {
class="kw">private Node {
}
class="kw">public class="kw">static int sort(DistanceTransform.Node var0, DistanceTransform.Node var1) {
class="kw">return Double.compare(var0.distance, var1.distance);
}
}
}