我正在寻找一种通过多个点制作直线曲线的方法。最好使用 3 个点,尽管我认为为了给进入点的线的角度提供上下文,可以说,可能需要更多的点来给曲线提供上下文。
一般来说,一个起点P1,一个控制点P2和一个终点P3,线应该从P1弯到P2,然后从P2弯到P3。
实际上,这是我想要达到的效果的完美示例:
如果我能做到这一点,我真的会永远感激不尽!
到目前为止,在 Java 中,我尝试过使用QuadCurve2D.Double、Cub icCurve2D.Double和Path2D.Double(将 curveTo 与 Path2D.Double 一起使用)之类的东西,但无济于事 - 绘制的曲线甚至没有接近通过指定的控制点。
这是迄今为止我尝试过的方法的图像:
这是我用来生成图像中的点和曲线的代码:
Graphics2D g = (Graphics2D) window.getGraphics();
g.setColor(Color.blue);
int d = 4;
// P0
int x0 = window.getWidth()/8;
int y0 = 250;
g.drawString("P0", x0, y0 + 4*d);
g.fillRect(x0, y0, d, d);
// P1
int x1 = (window.getWidth()/7)*2;
int y1 = 235;
g.drawString("P1", x1, y1 + 4*d);
g.fillRect(x1, y1, d, d);
// P2
int x2 = (window.getWidth()/2);
int y2 = 200;
g.drawString("P2", x2, y2 - 2*d);
g.fillRect(x2, y2, d, d);
// P3
int x3 = (window.getWidth()/7)*5;
int y3 = 235;
g.drawString("P3", x3, y3 + 4*d);
g.fillRect(x3, y3, d, d);
// P4
int x4 = (window.getWidth()/8)*7;
int y4 = 250;
g.drawString("P4", x4, y4 + 4*d);
g.fillRect(x4, y4, d, d);
g.setColor(Color.cyan);
QuadCurve2D quadCurve = new QuadCurve2D.Double(x0, y0, x2, y2, x4, y4);
g.draw(quadCurve);
g.setColor(Color.YELLOW);
CubicCurve2D.Double cubicCurve = new CubicCurve2D.Double((double)x0, (double)y0,
(double)x1, (double)y1,
(double)x2, (double)y2,
(double)x4, (double)y4);
g.draw(cubicCurve);
g.setColor(Color.red);
Path2D.Double path1 = new Path2D.Double();
path1.moveTo(x1, y1);
path1.curveTo(x0, y0, x2, y2, x4, y4);
g.draw(path1);
我希望曲线通过点的原因是我想“平滑”我写的折线图上顶点之间的过渡。在任何人提到它之前,JFree Chart 不是一个选项。我知道使用了不同类型的曲线和样条曲线,但我没有太多运气来准确理解它们的工作原理或如何实现适合我需要的东西。
我将非常感谢提供的任何帮助 - 提前致谢。