gpt4 book ai didi

java - 如何将抗锯齿应用于 GraphicsContext.fillArc() 等 javafx 方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:16:55 28 4
gpt4 key购买 nike

我是 javafx 的新手,我正在使用它的渲染函数编写游戏,具体来说,GraphicsContext.fillArc() 以及 eclipse 中的类似函数。

这是我当前的代码:

        BorderPane root = new BorderPane();

Scene scene = new Scene(root, 400, 400);
primaryStage.setScene(scene);
scene.getStylesheets()
.add(getClass().getResource("application.css").toExternalForm());

Canvas canvas = new Canvas(400, 400);
root.getChildren().add(canvas);

GraphicsContext gc = canvas.getGraphicsContext2D();
new AnimationTimer()
{
public void handle(long currentNanoTime)
{
gc.setFill(Color.BLUE);
gc.fillArc(150, 150, 100, 100, 0, 240, ArcType.ROUND);
}
}.start();
primaryStage.show();

然而,fillArc() 方法在我的屏幕上呈现出边缘参差不齐的形状。我想要应用抗锯齿以使边缘平滑。但是我在 GraphicsContext 类中找不到任何相关方法,并将 scene 的实例化更改为 new Scene(root, 400, 400, false, SceneAntialiasing.BALANCED) ; 也没有效果。所以我的问题是如何在 GraphicsContext.fillArc() 上实现抗锯齿,或者它是否从根本上可行?

此外,我对 javafx 和 cgi 总体上还很陌生,因此欢迎提出任何建议和建议。

更新:

正如@jewelsea 所建议的,当代码块 gc.setFill(Color.BLUE);
gc.fillArc(150, 150, 100, 100, 0, 240, ArcType.ROUND);
放置在 AnimationTimer 的匿名子类之外,渲染的图像是抗锯齿的。我们现在都不知道为什么。仅供引用。

最佳答案

我在使用 CanvasAnimationTimer 时遇到了类似的问题。解决方案的一个重要关键是 comment posted by @jewelsea :

"... if you comment out the animation timer and just draw the arc without it, then the arc is nicely antialiased ..."

这基本上意味着,如果我们绘制圆弧一次,它就是抗锯齿的。但是如果我们在AnimationTimerhandle()方法中绘制它,每秒绘制60次。在handle()方法中加入long sleep后可以更好的看到结果。第一次在白色背景上呈现圆圈并按预期显示。第二次在前一个蓝色圆圈之上呈现一个蓝色圆圈。由于抗锯齿而部分着色为蓝色的像素变得更暗。第三次画圆时也是如此,以此类推。下图显示了经过 1、2、3、4、5、10 和 50 次迭代后圆弧的放大部分:

arcs

该问题的一个简单解决方案是在渲染任何内容之前用背景颜色填充 Canvas :

public void handle(long currentNanoTime) {
gc.setFill(Color.WHITE);
gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight());

gc.setFill(Color.BLUE);
gc.fillArc(150, 150, 100, 100, 0, 240, ArcType.ROUND);
}

关于java - 如何将抗锯齿应用于 GraphicsContext.fillArc() 等 javafx 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34148521/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com