【发布时间】:2015-11-22 08:36:26
【问题描述】:
我一直在使用 Java 开发 nonogram 求解器,我的所有算法都运行良好,但我一直在为可视化而苦苦挣扎。
在算法执行期间,我可以访问两个“解决方案数组”。一个是int[][] 类型,包含值-1 表示“肯定是白色”,0 表示“不确定”,1 表示“肯定是黑色”。另一个数组是float[][] 类型,它包含0 和1 之间的值,这里0 代表肯定是白色,1 代表肯定是黑色,.2 的值表示它更有可能是单元格是白色的,而不是黑色的。
由于我最近从 PHP 切换到 Java 编程(没有适当的介绍),我不太了解如何正确可视化这个数组。当然,我首先尝试使用X、. 和? 等字符将第一种类型的数组简单地打印到控制台,但这远不是很好。然后我发现了一些关于BufferedImage 的东西,并创建了以下函数(对于float[][],int[][] 类似):
public void toImage(int w, int h, float[][] solution) throws IOException {
int[] data = toImage1(w, h, solution);
BufferedImage img = toImage2(data, w, h);
toImage3(img);
}
public int[] toImage1(int w, int h, float[][] solution) throws IOException {
int[] data = new int[w * h];
int i = 0;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
int a = y / 100;
int b = x / 100;
int z = (int) (255 * Math.sqrt(1 - solution[a][b]));
if (solution[a][b] == 1 && ((((y % 100 >= 10 && y % 100 <= 15) || (y % 100 >= 85 && y % 100 <= 90)) && x % 100 >= 10 && x % 100 <= 90) || (((x % 100 >= 10 && x % 100 <= 15) || (x % 100 >= 85 && x % 100 <= 90)) && y % 100 >= 10 && y % 100 <= 90))) {
z = 100;
} else if (solution[a][b] == 0 && ((((y % 100 >= 10 && y % 100 <= 15) || (y % 100 >= 85 && y % 100 <= 90)) && x % 100 >= 10 && x % 100 <= 90) || (((x % 100 >= 10 && x % 100 <= 15) || (x % 100 >= 85 && x % 100 <= 90)) && y % 100 >= 10 && y % 100 <= 90))) {
z = 230;
}
data[i++] = z << 16 | z << 8 | z;
}
}
return data;
}
public BufferedImage toImage2(int[] data, int w, int h) {
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
img.setRGB(0, 0, w, h, data, 0, w);
return img;
}
public void toImage3(BufferedImage img) throws IOException {
File f = new File("Nonogram.png");
ImageIO.write(img, "PNG", f);
}
这里,w 和 h 应该是每列中的单元格数量。行乘以 100(我希望每个单元格由 100x100 像素块表示)。
然后我还想在确定的单元格中添加一个额外的灰色框,这就是 if 和 else if 的用途。
但是,我遇到了两个问题:
- 这个函数超级慢。在分析执行后,我看到 90% 的执行时间都花在了这个函数上。按照 cmets 中的建议将我的功能分解为两位后,我得到以下配置文件:
- 我希望
JFrame显示我的图像,而不是写入 .png 文件,但是(再次因为我错过了对 Java 的正确介绍),JFrame似乎不是我最好的朋友和我似乎不知道如何使用它们。
是否有可能一次填充整个 100x100 像素的单元格?有没有办法不必每次都创建整个BufferedImage,而只需修改在另一种方法中更改的位?我应该使用BufferedImage 以外的其他东西吗?我的代码需要什么元素,有人可以编出一个示例方法,或者需要的代码sn-ps吗?
【问题讨论】:
-
您可能想要做的是在您的
JFrame中创建一个JPanel,然后将此BufferedImage添加到JPanel。 -
简化这些
if查询!!!。计算y % 100和x % 100几十次 次实在是太糟糕了(而且速度很慢,尽管在 JIT 启动后这可能不会对整体性能产生太大影响)
标签: java visualization data-visualization bufferedimage