SinglePixelSet class
Пакет: com.hypixel.hytale.server.worldgen.zoom
Файл: com/hypixel/hytale/server/worldgen/zoom/PixelDistanceProvider.java
implements: PixelDistanceProvider.IPixelSet
Поля (1)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private final int |
pixel |
Методы (3)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public boolean |
containspublic boolean contains(int var1) |
|
public int |
sizepublic int size() |
|
public String |
toStringpublic String toString() |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.worldgen.zoom;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import javax.annotation.Nonnull;
class="kw">public class PixelDistanceProvider {
class="kw">private class="kw">static class="kw">final int TABLE_SIZE = 8;
@Nonnull
class="kw">protected class="kw">final PixelProvider image;
class="kw">protected class="kw">final int width;
class="kw">protected class="kw">final int height;
class="kw">protected class="kw">final int cellsX;
class="kw">protected class="kw">final int cellsY;
@Nonnull
class="kw">protected class="kw">final PixelDistanceProvider.IPixelSet[] table;
@Nonnull
class="kw">protected class="kw">final IntSet pixels;
class="kw">public PixelDistanceProvider(@Nonnull PixelProvider var1) {
this.image = var1;
this.width = var1.getWidth();
this.height = var1.getHeight();
this.cellsX = var1.getWidth() / 8;
this.cellsY = var1.getHeight() / 8;
this.table = new PixelDistanceProvider.IPixelSet[this.cellsX * this.cellsY];
this.pixels = new IntOpenHashSet();
this.prepareSegmentTable();
}
@Nonnull
class="kw">public IntSet getColors() {
class="kw">return this.pixels;
}
class="kw">public double distanceSqToDifferentPixel(double var1, double var3, int var5, int var6) {
var5 = this.clampX(var5);
var6 = this.clampY(var6);
int var7 = this.image.getPixel(var5, var6);
int var8 = var5 / 8;
int var9 = var6 / 8;
double var10 = Double.POSITIVE_INFINITY;
int var12 = Math.max(var8 - 1, 0);
int var13 = Math.min(var8 + 2, this.cellsX);
int var14 = Math.max(var9 - 1, 0);
int var15 = Math.min(var9 + 2, this.cellsY);
for (int var16 = var12; var16 < var13; var16++) {
for (int var17 = var14; var17 < var15; var17++) {
double var18 = this.distanceSqToDiffInSeq(var1, var3, var7, var16, var17);
if (var18 < var10) {
var10 = var18;
}
}
}
class="kw">return var10;
}
class="kw">protected double distanceSqToDiffInSeq(double var1, double var3, int var5, int var6, int var7) {
double var8 = Double.POSITIVE_INFINITY;
if (this.hasDifferentPixel(var6, var7, var5)) {
int var10 = var6 * 8;
int var11 = var7 * 8;
for (int var12 = 0; var12 < 8; var12++) {
int var13 = var12 + var10;
for (int var14 = 0; var14 < 8; var14++) {
int var15 = var14 + var11;
if (var5 != this.image.getPixel(var13, var15)) {
double var16 = distanceSqToPixel(var1, var3, var13, var15);
if (var16 < var8) {
var8 = var16;
}
}
}
}
}
class="kw">return var8;
}
class="kw">protected boolean hasDifferentPixel(int var1, int var2, int var3) {
PixelDistanceProvider.IPixelSet var4 = this.table[this.cellIndex(var1, var2)];
class="kw">return !var4.contains(var3) || var4.size() > 1;
}
class="kw">private void prepareSegmentTable() {
for (int var1 = 0; var1 < this.cellsX; var1++) {
for (int var2 = 0; var2 < this.cellsY; var2++) {
IntSet var3 = new IntOpenHashSet();
int var4 = var1 * 8;
int var5 = var2 * 8;
for (int var6 = 0; var6 < 8; var6++) {
for (int var7 = 0; var7 < 8; var7++) {
int var8 = var6 + var4;
int var9 = var7 + var5;
if (var8 < this.width && var9 < this.height) {
var3.add(this.image.getPixel(var8, var9));
}
}
}
this.pixels.addAll(var3);
if (var3.size() == 1) {
this.table[this.cellIndex(var1, var2)] = new PixelDistanceProvider.SinglePixelSet(var3.iterator().nextInt());
} else {
this.table[this.cellIndex(var1, var2)] = new PixelDistanceProvider.MultiplePixelSet(var3);
}
}
}
}
class="kw">protected int clampX(int var1) {
if (var1 < 0) {
class="kw">return 0;
} else {
class="kw">return var1 >= this.width ? this.width - 1 : var1;
}
}
class="kw">protected int clampY(int var1) {
if (var1 < 0) {
class="kw">return 0;
} else {
class="kw">return var1 >= this.height ? this.height - 1 : var1;
}
}
class="kw">protected int cellIndex(int var1, int var2) {
class="kw">return var1 * this.cellsY + var2;
}
class="kw">private class="kw">static double distanceSqToPixel(double var0, double var2, int var4, int var5) {
double var6 = Math.max(Math.max(var4 - var0, var0 - var4 - 1.0), 0.0);
double var8 = Math.max(Math.max(var5 - var2, var2 - var5 - 1.0), 0.0);
class="kw">return var6 * var6 + var8 * var8;
}
class="kw">private class="kw">interface IPixelSet {
boolean contains(int var1);
int size();
}
class="kw">private class="kw">static class MultiplePixelSet class="kw">implements PixelDistanceProvider.IPixelSet {
class="kw">private class="kw">final IntSet pixels;
MultiplePixelSet(IntSet var1) {
this.pixels = var1;
}
@Override
class="kw">public boolean contains(int var1) {
class="kw">return this.pixels.contains(var1);
}
@Override
class="kw">public int size() {
class="kw">return this.pixels.size();
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "MultiplePixelSet{pixels=" + this.pixels + "}";
}
}
class="kw">private class="kw">static class SinglePixelSet class="kw">implements PixelDistanceProvider.IPixelSet {
class="kw">private class="kw">final int pixel;
SinglePixelSet(int var1) {
this.pixel = var1;
}
@Override
class="kw">public boolean contains(int var1) {
class="kw">return this.pixel == var1;
}
@Override
class="kw">public int size() {
class="kw">return 1;
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "SinglePixelSet{pixel=" + this.pixel + "}";
}
}
}