Я работаю над проектом, целью которого является воспроизведение изображений с использованием только фиксированного числа выпуклых оболочек / многоугольников.
Я использую JavaFX для создания приятного графического интерфейса.
Решение дляПроблема состоит в том, что список полигонов нарисован на холсте, что позволяет нам получить изображение.
Чтобы оценить качество решения, я беру изображение для воспроизведения и изображение, полученное из списка полигонов, и вычисляюрасстояние между цветами каждого пикселя.
Если у меня есть нулевое расстояние между цветами каждого пикселя, я могу сказать, что я воспроизвел целевое изображение.
Реализация, которую я сделал из этогофункция действительно медленная.
Подводя итог, я ищу для каждого пикселя, какие полигоны его содержат, а затем добавляю их цвет в правильном порядке (я использую прозрачный цвет, поэтому порядок важен).Я рассчитываю расстояние между этим цветом и цветом, который пытаюсь достичь (на изображении цели).Я суммирую эти расстояния и все!
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()));
}
Раньше я использовал функцию снимок , которая была быстрой, но заставляла меня вычислять оценку внутри потока JavaFX;поэтому, блокируя весь мой графический интерфейс, добавляя много вычислений в потоки GUI.
Это текущее решение позволяет мне размещать вычисления внутри Service , но это действительно медленно.
Я немного застрял в этом, и мне интересно, может ли кто-нибудь иметь для меня идею ...
Возможно, я также неправильно использую JavaFX.
Я могу дать большекода, если люди задаются вопросом, в чем заключается другая функция, но я на 100% уверен, что именно эта функция замедляет все.