Extracted generator into abstract class for experiments

This commit is contained in:
Klemek
2018-04-25 13:52:02 +02:00
parent a351ba6d8b
commit 65e597ed52
7 changed files with 107 additions and 78 deletions
+2 -2
View File
@@ -59,7 +59,7 @@ class Color {
return r + g + b; return r + g + b;
} }
public java.awt.Color toColor() { java.awt.Color toColor() {
return new java.awt.Color(r - Byte.MIN_VALUE, g - Byte.MIN_VALUE, b - Byte.MIN_VALUE); return new java.awt.Color(r - Byte.MIN_VALUE, g - Byte.MIN_VALUE, b - Byte.MIN_VALUE);
} }
@@ -68,7 +68,7 @@ class Color {
return toString(false); return toString(false);
} }
public String toString(boolean unsigned) { private String toString(boolean unsigned) {
return "(" + (unsigned ? r - Byte.MIN_VALUE : r) + "," + (unsigned ? g - Byte.MIN_VALUE : g) + "," + (unsigned ? b - Byte.MIN_VALUE : b) + ")"; return "(" + (unsigned ? r - Byte.MIN_VALUE : r) + "," + (unsigned ? g - Byte.MIN_VALUE : g) + "," + (unsigned ? b - Byte.MIN_VALUE : b) + ")";
} }
} }
@@ -0,0 +1,67 @@
package fr.klemek.marble;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
class DefaultGenerator extends Generator {
private final float slope;
private final Color source;
private final Color divergence;
DefaultGenerator(int width, int height) {
this(width, height, Utils.randInt(3, 12));
}
DefaultGenerator(int width, int height, int size) {
this(width, height, size, (float) Utils.randInt(40, 60) / 100f);
}
private DefaultGenerator(int width, int height, int size, float slope) {
this(width, height, size, slope, new Color(Utils.randInt(0, 30),
Utils.randInt(0, 30),
Utils.randInt(0, 30)));
}
private DefaultGenerator(int width, int height, int size, float slope, Color divergence) {
this(width, height, size, slope, divergence, null);
}
private DefaultGenerator(int width, int height, int size, float slope, Color divergence, Color source) {
super(width, height, size);
this.slope = slope;
this.divergence = divergence;
this.source = source;
}
@Override
void generate() {
if (seed == 0L)
seed = ThreadLocalRandom.current().nextLong();
System.out.println("\t\tseed : " + seed);
System.out.println("\t\tsize : " + size);
System.out.println("\t\tslope : " + slope);
System.out.println("\t\tdivergence : " + divergence + " = " + divergence.sum());
rand = new Random(seed);
table = new Color[width2][height2];
table[0][0] = source == null ? Color.random(rand) : source;
System.out.println("\t\tsource : " + source);
for (int y = 0; y < height2; y++)
generateLine(y);
}
private void generateLine(int y) {
for (int x = 0; x < width2; x++) {
Color div = divergence.diverge(rand);
if (x > 0 && y == 0) {
table[x][y] = Color.add(table[x - 1][y], div);
} else if (x == 0 && y > 0) {
table[x][y] = Color.add(table[x][y - 1], div);
} else if (x > 0 && y > 0) {
table[x][y] = Color.add(new float[]{slope, 1f - slope, 1f}, new Color[]{table[x][y - 1], table[x - 1][y], div});
}
}
}
}
+18 -60
View File
@@ -1,52 +1,27 @@
package fr.klemek.marble; package fr.klemek.marble;
import java.io.File;
import java.util.Random; import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
class Generator { abstract class Generator {
private final int width; private final int width;
private final int height; private final int height;
private final int width2; final int width2;
private final int height2; final int height2;
private final int size; final int size;
private final float slope; long seed = 0L;
private final Color source;
private final Color divergence;
private long seed = 0L; Color[][] table;
Random rand;
private Color[][] table;
private Random rand;
Generator(int width, int height) {
this(width, height, Utils.randInt(3, 12));
}
Generator(int width, int height, int size) { Generator(int width, int height, int size) {
this(width, height, size, (float) Utils.randInt(40, 60) / 100f);
}
Generator(int width, int height, int size, float slope) {
this(width, height, size, slope, new Color(Utils.randInt(0, 30),
Utils.randInt(0, 30),
Utils.randInt(0, 30)));
}
Generator(int width, int height, int size, float slope, Color divergence) {
this(width, height, size, slope, divergence, null);
}
Generator(int width, int height, int size, float slope, Color divergence, Color source) {
this.width = width; this.width = width;
this.height = height; this.height = height;
this.size = size; this.size = size;
this.width2 = width % size == 0 ? (width / size) : (width / size) + 1; this.width2 = width % size == 0 ? (width / size) : (width / size) + 1;
this.height2 = height % size == 0 ? (height / size) : (height / size) + 1; this.height2 = height % size == 0 ? (height / size) : (height / size) + 1;
this.slope = slope;
this.divergence = divergence;
this.source = source;
} }
public Color[][] getTable() { public Color[][] getTable() {
@@ -73,33 +48,7 @@ class Generator {
return size; return size;
} }
void generate() { abstract void generate();
if (seed == 0L)
seed = ThreadLocalRandom.current().nextLong();
System.out.println("\t\tseed : " + seed);
System.out.println("\t\tsize : " + size);
System.out.println("\t\tslope : " + slope);
System.out.println("\t\tdivergence : " + divergence + " = " + divergence.sum());
rand = new Random(seed);
table = new Color[width2][height2];
table[0][0] = source == null ? Color.random(rand) : source;
System.out.println("\t\tsource : " + source);
for (int y = 0; y < height2; y++)
generateLine(y);
}
private void generateLine(int y) {
for (int x = 0; x < width2; x++) {
Color div = divergence.diverge(rand);
if (x > 0 && y == 0) {
table[x][y] = Color.add(table[x - 1][y], div);
} else if (x == 0 && y > 0) {
table[x][y] = Color.add(table[x][y - 1], div);
} else if (x > 0 && y > 0) {
table[x][y] = Color.add(new float[]{slope, 1f - slope, 1f}, new Color[]{table[x][y - 1], table[x - 1][y], div});
}
}
}
byte[] getData() { byte[] getData() {
byte[] data = new byte[width * height * 3]; byte[] data = new byte[width * height * 3];
@@ -124,6 +73,15 @@ class Generator {
return data; return data;
} }
boolean saveBmp(File file) {
byte[] fileData = ImageUtils.generateBmpFile(width, getData());
return ImageUtils.saveBmpFile(fileData, file);
}
void show() {
new MarbleViewer(this);
}
} }
+5 -3
View File
@@ -1,12 +1,14 @@
package fr.klemek.marble; package fr.klemek.marble;
import java.io.File;
class LocalTests { class LocalTests {
public static void main(String[] args) { public static void main(String[] args) {
Generator gen = new Generator(800, 800, 2); DefaultGenerator gen = new DefaultGenerator(800, 800, 2);
gen.generate(); gen.generate();
gen.saveBmp(new File("temp.bmp"));
new MarbleViewer(gen); gen.show();
} }
} }
+2 -2
View File
@@ -5,7 +5,7 @@ import java.awt.*;
class MarbleViewer extends JFrame { class MarbleViewer extends JFrame {
public MarbleViewer(Generator generator) { MarbleViewer(Generator generator) {
this.setLocation(0, 0); this.setLocation(0, 0);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setResizable(false); this.setResizable(false);
@@ -16,7 +16,7 @@ class MarbleViewer extends JFrame {
private class Panel extends JPanel { private class Panel extends JPanel {
private final Generator generator; private transient final Generator generator;
Panel(Generator generator) { Panel(Generator generator) {
this.generator = generator; this.generator = generator;
+5 -9
View File
@@ -31,9 +31,7 @@ final class Utils {
static byte[] subArray(byte[] array, int start, int stop) { static byte[] subArray(byte[] array, int start, int stop) {
byte[] out = new byte[stop - start]; byte[] out = new byte[stop - start];
for (int i = start; i < stop; i++) { System.arraycopy(array, start, out, 0, stop - start);
out[i - start] = array[i];
}
return out; return out;
} }
@@ -55,9 +53,7 @@ final class Utils {
} }
static void writeArray(byte[] out, byte[] data, int start, int stop, int padding) { static void writeArray(byte[] out, byte[] data, int start, int stop, int padding) {
for (int i = 0; i < Math.min(stop, out.length) - start; i++) { System.arraycopy(data, padding, out, start, Math.min(stop, out.length) - start);
out[i + start] = data[i + padding];
}
} }
static void writeArray(byte[] out, byte[] data, int start, int padding) { static void writeArray(byte[] out, byte[] data, int start, int padding) {
@@ -68,9 +64,9 @@ final class Utils {
writeArray(out, data, start, 0); writeArray(out, data, start, 0);
} }
static byte[] num2bytes(int number, int nbyte) { static byte[] num2bytes(int number, int nByte) {
byte[] b = new byte[nbyte]; byte[] b = new byte[nByte];
for (int i = 0; i < nbyte; i++) { for (int i = 0; i < nByte; i++) {
b[i] = (byte) (number % 256); b[i] = (byte) (number % 256);
number = number / 256; number = number / 256;
} }
+8 -2
View File
@@ -2,6 +2,8 @@ package fr.klemek.marble;
import java.awt.*; import java.awt.*;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
class WallpaperGenerator { class WallpaperGenerator {
@@ -45,7 +47,7 @@ class WallpaperGenerator {
File outputFile = new File(name + ".jpg"); File outputFile = new File(name + ".jpg");
long t0 = System.currentTimeMillis(); long t0 = System.currentTimeMillis();
Generator gen = size == 0 ? new Generator(width, height) : new Generator(width, height, size); DefaultGenerator gen = size == 0 ? new DefaultGenerator(width, height) : new DefaultGenerator(width, height, size);
long t1 = System.currentTimeMillis(); long t1 = System.currentTimeMillis();
gen.generate(); gen.generate();
System.out.println("\tGeneration done in " + (System.currentTimeMillis() - t1) + " ms"); System.out.println("\tGeneration done in " + (System.currentTimeMillis() - t1) + " ms");
@@ -65,8 +67,12 @@ class WallpaperGenerator {
return; return;
System.out.println("\tFile converting done in " + (System.currentTimeMillis() - t1) + " ms"); System.out.println("\tFile converting done in " + (System.currentTimeMillis() - t1) + " ms");
if (bmpFile.delete()) try {
Files.delete(bmpFile.toPath());
System.out.println("\tFile '" + bmpFile.getName() + "' deleted"); System.out.println("\tFile '" + bmpFile.getName() + "' deleted");
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Wallpaper done in " + (System.currentTimeMillis() - t0) + " ms"); System.out.println("Wallpaper done in " + (System.currentTimeMillis() - t0) + " ms");
} }