我正在从事一个旨在仅使用固定数量的凸包/多边形来复制图像的项目。
我正在使用JavaFX来提供漂亮的GUI。
解决这个问题的方法是在画布上绘制多边形列表,让我们获得图像。
为了评估解决方案的质量,我要拍摄要复制的图像以及从多边形列表中获取的图像,然后计算每个像素颜色之间的距离。
如果每个像素的颜色之间的距离为零,则可以说我复制了目标图像。
我对此功能的实现速度很慢。
总而言之,我为每个像素搜索包含它的多边形是什么,然后以正确的顺序添加颜色(我使用的是透明颜色,因此顺序很重要)。 我计算出该颜色与我尝试达到的颜色之间的距离(在目标图像上)。 我总结了这些距离,就是这样!
private void computeEval() {
PixelReader pixelReaderSolution = image.getPixelReader();
AtomicReference<Double> eval2 = new AtomicReference<>((double) 0);
Lock lock = new ReentrantLock();
IntStream.range(0, (int) image.getWidth()).parallel()
.forEach(x -> IntStream.range(0, (int) image.getHeight()).parallel()
.forEach(y -> {
Color colorSolution = pixelReaderSolution.getColor(x, y);
Point2D pixel = new Point2D(x, y);
AtomicReference<Color> pixelColor = new AtomicReference<>();
pixelColor.set(null);
polygons.stream()
.filter(convexPolygon -> convexPolygon.getAsPolygon().contains(pixel))
.forEach(convexPolygon -> {
if (pixelColor.get() == null) {
pixelColor.set(convexPolygon.color);
} else {
pixelColor.set(addColor(pixelColor.get(), convexPolygon.color));
}
});
if (pixelColor.get() == null) {
pixelColor.set(Color.WHITE);
}
lock.lock();
eval2.updateAndGet(v -> v + distanceColor(colorSolution, pixelColor.get()));
lock.unlock();
}));
evaluation = 1 - (eval2.get() / (3 * image.getWidth() * image.getHeight()));
}
过去,我使用的函数snapshot很快,但是却迫使我在JavaFX线程中计算评估值。因此,通过在GUI线程中进行大量计算来阻塞我的整个GUI。
当前的解决方案使我可以将计算放在Service内,但这确实很慢。
我对此有些困惑,我想知道是否有人对我有想法...
我也可能以错误的方式使用JavaFX。
如果人们想知道周围有什么不同的功能,我可以给出更多的代码,但我100%认为是该功能使所有功能变慢。