如何在拖动鼠标时平滑填充椭圆
Posted
技术标签:
【中文标题】如何在拖动鼠标时平滑填充椭圆【英文标题】:How to fill ellipses smoothly while dragging mouse 【发布时间】:2019-09-28 11:40:12 【问题描述】:我正在使用 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
【问题讨论】:
coherent line
是什么意思?并请包含足够的代码来演示问题。
【参考方案1】:
您的鼠标以特定频率工作(普通鼠标工作在 100Hz 左右),因此它会在您移动时选择一定数量的点。
如果你在半秒内覆盖 1000 像素(这不是很快),它将选择 50 个点,它们将每 20 个像素间隔。
如果您的圆的半径小于该半径,您将看到一条虚线。
即使使用非常快的鼠标也无法让你有一条连续的线。
如果需要,您可以在点之间画一条线而不是画一个圆,或者在最后一个圆和当前圆之间插入坐标,并在两个圆之间创建其他圆。
【讨论】:
【参考方案2】:来试试这个。
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
public class FillOvals extends JPanel
private JFrame frame = new JFrame();
private List<Point> points = new ArrayList<>();
public static void main(String[] args)
SwingUtilities.invokeLater(() -> new FillOvals().start());
public FillOvals()
setPreferredSize(new Dimension(500, 500));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.pack();
frame.setLocationRelativeTo(null); // center on screen
frame.setVisible(true);
public void start()
MyMouseListener ml = new MyMouseListener();
addMouseMotionListener(ml);
addMouseListener(ml);
public void paintComponent(Graphics g)
super.paintComponent(g);
if (points.size() < 1)
return;
Graphics2D g2d = (Graphics2D) g.create();
// keep the line smooth on the edges
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.BLUE);
Point p = points.get(0);
int lastx = p.x;
int lasty = p.y;
g2d.setStroke(new BasicStroke(10.f));
for (int i = 1; i < points.size(); i++)
p = points.get(i);
g2d.drawLine(lastx, lasty, p.x, p.y);
lastx = p.x;
lasty = p.y;
g2d.dispose();
private class MyMouseListener extends MouseAdapter
public void mouseDragged(MouseEvent e)
points.add(e.getPoint());
repaint();
public void mousePressed(MouseEvent e)
points.add(e.getPoint());
repaint();
JVM/鼠标跟不上画圈的速度。我提供的示例在两点之间连续绘制一条线。
【讨论】:
以上是关于如何在拖动鼠标时平滑填充椭圆的主要内容,如果未能解决你的问题,请参考以下文章