使用鼠标拖动在Java中绘制曲线

时间:2018-02-18 00:42:07

标签: java awt graphics2d

我是java的新手,我正在尝试画一条曲线。我试图实现的功能是曲线应该通过鼠标拖动然后鼠标单击来定义。 一旦拖动动作完成,我想要从拖动的开始到结束绘制一条线。在此之后单击画布应被视为定义曲线所需的第三个点,绘制的线应更改为曲线。
我怎么做? 我在这里经历了关于如何绘制Bezier曲线的不同帖子,但我非常困惑。这是我使用鼠标事件绘制矩形,椭圆和线条的一大块代码:

   public void mousePressed(MouseEvent e) {

        xCoordinateInitial = e.getX(); //Initialize x-coordinate to the mouse x-coordinate
        yCoordinateInitial = e.getY() + shiftInY; //Initialize y-coordinate to the mouse y-coordinate
        System.out.println("X-coordinate: " + xCoordinateInitial);
        System.out.println("Y-coordinate: " + yCoordinateInitial);
    }

    public void mouseReleased(MouseEvent e) {

        Graphics2D G = (Graphics2D) getGraphics();
        G.setStroke(new BasicStroke(lineThickness));
        G.setColor(colorSelected);
        G.setPaint(colorSelected);
        xCoordinateFinal = e.getX(); //Set final x-coordinate to the mouse x-coordinate after drag
        yCoordinateFinal = e.getY() + shiftInY; //Set final y-coordinate to the mouse y-coordinate after drag
        int x = xCoordinateInitial;
        int y = yCoordinateInitial;
        int width = xCoordinateFinal - xCoordinateInitial; //Setting width
        int height = yCoordinateFinal - yCoordinateInitial; //Setting height



        if (yCoordinateFinal < yCoordinateInitial) {
            y = yCoordinateFinal;
            height = yCoordinateInitial - yCoordinateFinal;
        }

        if (xCoordinateFinal < xCoordinateInitial) {
            x = xCoordinateFinal;
            width = xCoordinateInitial - xCoordinateFinal;
        }


        // Shape Selection
        switch (shapeSelected) {
            case Line:

                G.drawLine(xCoordinateInitial, yCoordinateInitial, xCoordinateFinal, yCoordinateFinal);
                break;

            case Rectangle:
                G.fillRect(x, y, width, height);
                break;

            case Oval:
                G.fillOval(x, y, width, height);
                break;

            case Curve :

                // To implement

        }

    }
});

我试图理解以下内容,但我无法使其发挥作用:

                        Path2D p = new GeneralPath();
                        p.moveTo(x1, y1);
                        p.curveTo(bx1, by1, bx2, by2, x2, y2);
                        G.draw(p);

1 个答案:

答案 0 :(得分:1)

让我们首先阅读Path2D#curveTo

的JavaDocs
  

public final void curveTo(double x1,
                            双y1,
                            双x2,
                            双y2,
                            双x3,
                            double y3)

通过绘制Bézier曲线,将三个新点定义的曲线段添加到路径中   相交当前坐标和指定坐标   (x3,y3),使用指定的点(x1,y1)和(x2,y2)作为Bézier   控制点。所有坐标都以双精度指定。

好吧,让我们公平一点,这需要一些阅读才能理解,这可能会更好地解决一些图形问题。

基本概念是,你有三个控制点,其中一个作为“看待”约束。

假设您有三个点,http://www.example.com/level1/level2/anchortargetclick是第一点,anchor是拖动的点,target是拖动操作完成后点击的点。

如果我们使用订单click,我们最终会看到类似

的曲线

Curve

其中anchor, target, clickP1 == anchorP2 == target。正如您所看到的,P3 == click充当“查看约束”并试图将结果曲线拉向它。

但是,如果我们使用P2,我们会更喜欢......

Curve

其中anchor, click, targetP1 == anchorP2 == click。正如您所看到的,P3 == target充当“查看约束”并试图将结果曲线拉向它。

这基本上是Bézier曲线的工作原理

实施例...

好的,所以要把它们放在一起,我写了一些测试代码,你可以用它来改变参数并测试这个想法

这个例子做的一件事就是在建立前两个点之后,在移动鼠标时绘制预期曲线的“虚假”示例,为您提供曲线外观的视觉反馈,直到用户单击鼠标并设置路径

P2