gpt4 book ai didi

canvas - JavaFX:通过绘画删除线条

转载 作者:行者123 更新时间:2023-12-03 17:36:16 25 4
gpt4 key购买 nike

我是 JavaFX 的新手,我正在尝试在 Canvas 上绘制一些东西。

首先,我将 linecolor 设置为黑色并画一条线。

canvas.getGraphicsContext2D().setStroke(Color.BLACK);
canvas.getGraphicsContext2D().strokeLine(20,20,100,100);

在此之后,我试图通过在这条线上画一条白线来删除这条线:
canvas.getGraphicsContext2D().setStroke(Color.WHITE);  
canvas.getGraphicsContext2D().strokeLine(20,20,100,100);

但是 Canvas 上会留下一些灰色像素。这是什么原因,我该如何防止?

这就是我创建场景的方式
Pane root = new Pane();
canvas = new Canvas(200, 200);
GraphicsContext gc = canvas.getGraphicsContext2D();
gc.strokeLine(20,20,100,100);
scene = new Scene(root, 200, 200);
this.setColor(Color.WHITE);
root.getChildren().add(canvas);

谢谢,马丁

最佳答案

这个问题与抗锯齿有关。如果某个点具有非整数坐标,则其绘制将被划分为多个像素并进行部分填充。像这样(放大):enter image description here
所以,如果你画一些不同于水平线或垂直线的东西,你就会得到这种效果。如果你想绕过这种效果,请使用逐像素绘图:

public class Test extends Application {

@Override
public void start(Stage primaryStage) {
Canvas canvas = new Canvas();
canvas.setWidth(200);
canvas.setHeight(200);
GraphicsContext gc = canvas.getGraphicsContext2D();

gc.setLineWidth(4);
gc.setStroke(Color.BLACK);
drawLine(gc, 20, 20, 180, 180);
gc.setStroke(Color.WHITE);
drawLine(gc, 20, 20, 180, 180);

Pane pane = new Pane(canvas);
primaryStage.setScene(new Scene(pane));
primaryStage.show();
}

private void drawLine(GraphicsContext gc, double x1, double y1, double x2, double y2) {
double lineWidth = gc.getLineWidth();
Color color = (Color) gc.getStroke();
PixelWriter pw = gc.getPixelWriter();

double k = (y2 - y1) / (x2 - x1);
double b = (x1 * y2 - x2 * y1) / (x1 - x2);

int val;
for (int x = (int) x1; x <= (int) x2; x++) {
val = (int) (k * x + b);
for (int y = (int) (val - (lineWidth-1) / 2); y < val + lineWidth / 2; y++) {
pw.setColor(x, y, color);
}
}

}


public static void main(String[] args) {
launch(args);
}
}

它有效,但它是如此复杂。您将需要为不同的形状创建许多方法。最好的解决方案是清理和重新绘制更改。

关于canvas - JavaFX:通过绘画删除线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47722900/

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