我正在寻找一种方法让一条线条曲线通过多个点。最好使用3个点,尽管我考虑过为了给予线条进入某个点的角度上下文,可能需要更多点来给曲线提供上下文。
通常情况下,有起始点 P1,控制点 P2 和结束点 P3,线条应该从 P1 曲线到 P2,然后从 P2 曲线到 P3。
事实上,这里有一个完美的例子,展示了我想实现的效果:
如果我能做到这一点,我将非常感激!
在 Java 中,我已经尝试过使用诸如 QuadCurve2D.Double、CubicCurve2D.Double 以及 Path2D.Double(使用 Path2D.Double 的 curveTo)等方法,但都没有成功——绘制的曲线与指定的控制点相差甚远。
这里是我迄今为止尝试过的方法的图像:
这是我用来生成图片中的点和曲线的代码:
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之前,请注意它不是我的选择。我知道有不同类型的曲线和样条线可用,但我并没有很好地理解它们的工作原理或如何实现适合我的需求。非常感谢您提供的任何帮助 - 提前致谢。