【问题标题】:Drawing in Java 2D with fast mousemovement使用快速鼠标移动在 Java 2D 中绘图
【发布时间】:2016-04-28 10:02:42
【问题描述】:

这会很长,所以提前感谢您阅读和/或回答:)

编辑:这个How to draw a continuous curve of repeated ovals on speedy mouse cursor dragging? 有一个我不太满意的答案,除了在矩形或椭圆形之间画直线之外,没有其他方法吗? (矩形或椭圆形对我来说无关紧要)。

我搜索了很多,但没有找到我要找的东西,所以我们开始吧: 我必须为大学创建一个绘图应用程序,我实际上已经完成了,但我的一个问题是 mouseDragged 事件似乎没有足够快地识别运动(?)。这意味着,如果用户用画笔徒手绘制并且移动鼠标太快,程序将不会绘制“连续的矩形线”。相反,绘图中会有很多间隙。这就是我的paint() 覆盖和mousemotionlistener(对于应该等同于画笔/笔的currentTool 1)的样子:

public void paint(Graphics g){

    g2d = (Graphics2D)g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setComposite(AlphaComposite.getInstance(
            AlphaComposite.SRC_OVER, 1.0f));
    Iterator<Color> sc = strokeColours.iterator();
    Iterator<Color> fc = fillColours.iterator();
    Iterator<Boolean> fill = fillq.iterator();

    for (Shape s : shapes){
        g2d.setStroke(new BasicStroke(4));
        g2d.setPaint(sc.next());
        g2d.draw(s);
        g2d.setPaint(fc.next());
        if (fill.next()){
            g2d.fill(s);    
        }
    }
    if (temp!=null){
        g2d.setComposite(AlphaComposite.getInstance(
                AlphaComposite.SRC_OVER, 0.5f));
        g2d.setPaint(strokeColour);
        g2d.draw(temp);
        if(isfilled){
            g2d.setPaint(fillColour);
            g2d.fill(temp);
        }
    }
}

运动监听器:

this.addMouseMotionListener(new MouseMotionAdapter(){
        public void mouseDragged(MouseEvent e){
            mx2=e.getX();
            my2=e.getY();
            if (currentTool==1){        
                Shape point= new Rectangle2D.Double(mx2-(0.5*penStroke),my2-(0.5*penStroke),0.5+penStroke,0.5+penStroke);
                shapes.add(point);
                addColours(strokeColour);
            }

            else if(...){...
            }


            repaint();              
        }
    } );
}

注意:手动定义 addColours(Color c) 函数以将 strokeColour 添加到 strokeColours 和 fillColours 以及将“true”添加到 fillq。 penStroke 是通过使用滑块定义的,并且仅用于此“工具”。

【问题讨论】:

  • 您可以维护有关“点”的信息并简单地在它们之间迭代对象的绘制,您现在需要确定迭代级别

标签: java graphics2d repaint java-2d mousemotionlistener


【解决方案1】:

Shape,一些子类会做贝塞尔曲线之类的。对于最后检测到的鼠标点,请尝试 CubicCurve2D.Float、QuadCurve2D.Double 等。请注意,并非所有曲线的“控制”点都位于曲线本身上,但无需(大量)数学即可获得良好的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多