我是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);
答案 0 :(得分:1)
让我们首先阅读Path2D#curveTo
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/
,anchor
和target
。 click
是第一点,anchor
是拖动的点,target
是拖动操作完成后点击的点。
如果我们使用订单click
,我们最终会看到类似
其中anchor, target, click
,P1 == anchor
和P2 == target
。正如您所看到的,P3 == click
充当“查看约束”并试图将结果曲线拉向它。
但是,如果我们使用P2
,我们会更喜欢......
其中anchor, click, target
,P1 == anchor
和P2 == click
。正如您所看到的,P3 == target
充当“查看约束”并试图将结果曲线拉向它。
这基本上是Bézier曲线的工作原理
好的,所以要把它们放在一起,我写了一些测试代码,你可以用它来改变参数并测试这个想法
这个例子做的一件事就是在建立前两个点之后,在移动鼠标时绘制预期曲线的“虚假”示例,为您提供曲线外观的视觉反馈,直到用户单击鼠标并设置路径
P2