我目前正在使用 JavaFX 创建绘画应用程序。我目前有一个绘画函数(称为 squiggle),它从鼠标事件中获取一个点数组并创建连接每个点的线段。当我只处理 1px 线段时,这起初还不错。后来我使用 实现了一个笔触宽度变换器GraphicsContent.setStroke()
,它突出了线段自然呈矩形的事实。这会导致线条(尤其是在使用较粗的笔触宽度时)变得非常模糊且通常很奇怪。
我的想法是用这些点创建一个圆圈阵列,使其具有更真实的画笔感觉,但是这并不奏效,因为这些圆圈没有连接并且在每个点之间留下了很大的间隙。
当我尝试用线段连接每个圆时,它只会回到与之前相同的问题,因为矩形通常会遮住圆的阴影。
我也尝试过使用路径,这是我以前从未尝试过的。这只会让我回到原来的问题,但现在我在绘图时遇到了更多的延迟。这可能是因为我的实现方式错误,但目前,我甚至不确定路径是否会对我有帮助。
这是我toPath
在 Squiggle 类中的方法:
public Path toPath(){
Path path = new Path();
path.setStroke(this.getColor());
path.setStrokeWidth(this.getStrokeWidth());
path.setStrokeLineCap(StrokeLineCap.ROUND);
if (this.points.isEmpty()) {
return path;
}
Point start = this.points.getFirst();
path.getElements().add(new MoveTo(start.x, start.y));
for(int i = 1; i < this.points.size(); i++){
Point point = this.points.get(i);
path.getElements().add(new LineTo(point.x, point.y));
}
return path;
}
这是我的绘画面板中的更新方法:
GraphicsContext g2d = this.getGraphicsContext2D();
for(Squiggle sq: squiggles){
Path path = sq.toPath();
if (!path.getElements().isEmpty()){
for (var element : path.getElements()) {
if (element instanceof MoveTo moveTo) {
g2d.moveTo(moveTo.getX(), moveTo.getY());
} else if (element instanceof LineTo lineTo) {
g2d.lineTo(lineTo.getX(), lineTo.getY());
}
}
g2d.stroke();
}
}
我做错了什么吗?或者我需要尝试别的吗?