Javafx2.2 Canvas проблема увеличения и уменьшения искажений - PullRequest
0 голосов
/ 30 сентября 2018

Мы используем javafx для разработки масштабируемой графической программы.Учитывая производительность, мы используем javafx canvas для рисования множества прямоугольных блоков.Прямоугольный прямоугольник представляет позицию контейнера.Мы обнаружили, что на прямоугольнике будут появляться толстые и тонкие линии, размытые и так далее.Наша графика должна быть масштабирована.Рассчитанная ширина и координаты прямоугольной рамки будут иметь числа с плавающей запятой.Мы не можем решить проблему, используя следующий пост. Как нарисовать четкую непрозрачную линию роста волос в JavaFX 2.2?

Это мой пример.

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
public class LineScaleTest extends Application {
public static void main(String[] args) { launch(args); }

@Override public void start(Stage stage) {
    AnchorPane anchorPane=new AnchorPane();
    Canvas canvas=new Canvas(500,300);
    canvas.relocate(300,300);
    GraphicsContext gc=canvas.getGraphicsContext2D();
    for(int i=0;i<10;i++){
        gc.strokeRoundRect(10.5+35*i,5.5,30,30,0,0);
    }

    for(int i=0;i<10;i++){
        gc.strokeRoundRect(10.5+35*i,65.5,30,30,0,0);
    }

    for(int i=0;i<10;i++){
        gc.strokeRoundRect(10.5+35*i,115.5,30,30,0,0);
    }

    anchorPane.setOnScroll(new EventHandler<ScrollEvent>() {
        @Override
        public void handle(ScrollEvent e) {
            if (e.getDeltaY() == 0) {
                return;
            }
            double scaleFactor = (e.getDeltaY() > 0) ? 1.1
                    : 1 / 1.1;
            anchorPane.setScaleX(anchorPane.getScaleX() * scaleFactor);
            anchorPane.setScaleY(anchorPane.getScaleY() * scaleFactor);
        }
    });
    anchorPane.getChildren().add(canvas);
    Scene scene = new Scene( anchorPane,1200, 700);
    stage.setScene(scene);
    stage.show();
}
}

example2 #############################################################

открытый класс LineScaleTest extends Application {public static void main (String [] args) {launch (args);}

@Override public void start(Stage stage) {
    AnchorPane anchorPane=new AnchorPane();
    Canvas canvas=new Canvas(500,300);
    canvas.relocate(300,300);
    GraphicsContext gc=canvas.getGraphicsContext2D();
    for(int i=0;i<10;i++){
        gc.strokeRoundRect(10.5+35*i,5.5,30,30,0,0);
    }

    for(int i=0;i<10;i++){
        gc.strokeRoundRect(10.5+35*i,65.5,30,30,0,0);
    }

    for(int i=0;i<10;i++){
        gc.strokeRoundRect(10.5+35*i,115.5,30,30,0,0);
    }

    anchorPane.setOnScroll(new EventHandler<ScrollEvent>() {
        @Override
        public void handle(ScrollEvent e) {
            if (e.getDeltaY() == 0) {
                return;
            }
            double scaleFactor = (e.getDeltaY() > 0) ? 1.1
                    : 1 / 1.1;
            Scale scale=new Scale(anchorPane.getScaleX() * scaleFactor,anchorPane.getScaleY() * scaleFactor);
            Affine reflectTransform = new Affine();
            reflectTransform.append(scale);
            canvas.getTransforms().add(reflectTransform);
        }
    });
    anchorPane.getChildren().add(canvas);
    Scene scene = new Scene( anchorPane,1200, 700);
    stage.setScene(scene);
    stage.show();
}

}

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Я не думаю, что вы можете положиться на что-то встроенное в JavaFX, чтобы получить именно тот результат, который вы хотите.Ваше приложение должно будет управлять этим самостоятельно, чтобы произвести желаемый результат.Таким образом, вместо того, чтобы называть «масштаб», вам нужно увеличить ширину и высоту холста самостоятельно, а затем выполнить перерисовку на основе новых измерений.Ваш код рендеринга может гарантировать, что используемые координаты не вызовут размытости или размытия.

0 голосов
/ 04 октября 2018

Вместо масштабирования anchorPane вы можете определить аффинное преобразование для Canvas.GraphicsContext обеспечивает функциональность для этого.

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