Completed clue6
This commit is contained in:
parent
0fe372168a
commit
a0ebcc9905
4 changed files with 96 additions and 0 deletions
BIN
clue6.png
Normal file
BIN
clue6.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.3 MiB |
BIN
clue6_data.png
Normal file
BIN
clue6_data.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
BIN
clue6_output.png
Normal file
BIN
clue6_output.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.3 KiB |
96
src/clue6/Main.java
Normal file
96
src/clue6/Main.java
Normal file
|
@ -0,0 +1,96 @@
|
|||
package clue6;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
FileInputStream stream = new FileInputStream("clue6_data.png");
|
||||
BufferedImage image = ImageIO.read(stream);
|
||||
stream.close();
|
||||
int width = image.getWidth();
|
||||
int height = image.getHeight();
|
||||
int[] raw = image.getRGB(0, 0, width, height, null, 0, width);
|
||||
int[] output = new int[width * height];
|
||||
|
||||
for (int i = 0; i < width * height; ++i)
|
||||
output[i] = 0xFF000000;
|
||||
|
||||
for (int i = 0; i < width * height; ++i) {
|
||||
if (raw[i] != 0xFFFFFFFF) {
|
||||
int other = findMatch(i, raw);
|
||||
raw[i] = 0xFFFFFFFF;
|
||||
raw[other] = 0xFFFFFFFF;
|
||||
if (i == 7559)
|
||||
System.out.println(other % width + ", " + other / width);
|
||||
connect(
|
||||
i % width, i / width,
|
||||
other % width, other / width,
|
||||
width, output
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
image.setRGB(0, 0, width, height, output, 0, width);
|
||||
ImageIO.write(image, "png", new File("clue6_output.png"));
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static int findMatch(int index, int[] data) {
|
||||
int i = index;
|
||||
while (++i < data.length && data[index] != data[i]);
|
||||
return i;
|
||||
}
|
||||
|
||||
private static void connect(int x0, int y0, int x1, int y1, int width, int[] write) {
|
||||
boolean flip = (y0 > y1) != (x0 > x1);
|
||||
int temp = x0;
|
||||
x0 = Math.min(temp, x1);
|
||||
x1 = Math.max(temp, x1);
|
||||
temp = y0;
|
||||
y0 = Math.min(temp, y1);
|
||||
y1 = Math.max(temp, y1);
|
||||
if (x0 == x1) {
|
||||
for (int i = y0; i <= y1; ++i)
|
||||
emit(x0, i, width, write);
|
||||
}
|
||||
else if (y0 == y1) {
|
||||
for (int i = x0; i <= x1; ++i)
|
||||
emit(i, y0, width, write);
|
||||
}
|
||||
else {
|
||||
float xDiff = x1 - x0 + 1;
|
||||
float yDiff = y1 - y0 + 1;
|
||||
for (int i = 0; i < xDiff - 1; ++i) {
|
||||
float begin = i / xDiff;
|
||||
float end = (i + 1) / xDiff;
|
||||
float avg = (begin + end) / 2;
|
||||
for (int j = (int) (begin * yDiff); j <= end * yDiff; ++j) {
|
||||
if (flip) {
|
||||
if (j < avg * yDiff)
|
||||
emit(x0 + i, y1 - j, width, write);
|
||||
else
|
||||
emit(x0 + i + 1, y1 - j, width, write);
|
||||
}
|
||||
else {
|
||||
if (j < avg * yDiff)
|
||||
emit(x0 + i, y0 + j, width, write);
|
||||
else
|
||||
emit(x0 + i + 1, y0 + j, width, write);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void emit(int x, int y, int width, int[] write) {
|
||||
write[x + y * width] = 0xFFFF2277;
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue