JavaFX - получить цвет пикселей при рисовании многоугольников друг над другом - PullRequest
0 голосов
/ 08 декабря 2018

Я работаю над проектом, целью которого является воспроизведение изображений с использованием только фиксированного числа выпуклых оболочек / многоугольников.

Я использую 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% уверен, что именно эта функция замедляет все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...