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);
      }
   }
}