首页 > 解决方案 > 如何在拖动鼠标时平滑填充椭圆

问题描述

我正在使用 MouseMotion 侦听器向 HashSet 添加形状,然后使用 Graphics2D 填充它们。但是,当我将鼠标移动得太快时,这些点不再形成一条连贯的线。

我试过谷歌搜索,但没有找到相关的答案。

addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent e) {
                //points.add(new Point(e.getX(), e.getY()));
                shapes.add(new ShapeInfo(circle, new Point(e.getX(), e.getY()), color));
                repaint();
            }
        });
for(ShapeInfo info : shapes) {
            Point location = info.point.getLocation();
            g2d.translate(location.x, location.y);
            g2d.setColor(info.color);
            g2d.fill(info.shape);
            g2d.translate(-location.x, -location.y);
        }

我希望得到一条由圆圈组成的漂亮、流畅的线条,但最终会得到分散的圆圈。https://imgur.com/a/KLOyPcn <- 这是我在绘画时拖动鼠标过快时发生的情况。

标签: javaswingawtpaint

解决方案


您的鼠标以特定频率工作(普通鼠标工作在 100Hz 左右),因此它会在您移动时选择一定数量的点。

如果你在半秒内覆盖 1000 像素(这不是很快),它将选择 50 个点,它们将每 20 个像素间隔。

如果您的圆的半径小于该半径,您将看到一条虚线。

即使使用非常快的鼠标也无法使您获得连续的线条。

如果需要,您可以在点之间画一条线而不是画一个圆,或者在最后一个圆和当前圆之间插入坐标,并在两个圆之间创建其他圆。


推荐阅读