Cómo hacer una curva de línea a través de puntos

Estoy buscando una manera de hacer una curva de línea a través de una serie de puntos. Sería preferible usar 3 puntos, aunque he considerado que para dar contexto al ángulo de la línea que ingresa a un punto, se puede necesitar más para darle contexto a la curva, por así decirlo.

En general, un punto de inicio P1, un punto de control P2 y un punto final P3, la línea debe curvarse a P2 desde P1 y luego curvarse desde P2 a P3.

De hecho, aquí hay un ejemplo perfecto del efecto que me gustaría lograr:

¡Si pudiera hacer esto realmente estaría eternamente agradecido!

En Java hasta ahora, he intentado jugar con cosas comoQuadCurve2D.Double , Cub icCurve2D.Double y tambiénPath2D.Double (usando curveTo con Path2D.Double) pero en vano, las curvas que están pintadas no están ni cerca de pasar por el punto de control especificado.

Aquí hay una imagen de los métodos que he probado hasta ahora:

Y aquí está el código que utilicé para generar los puntos y las curvas en la imagen:

    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);

Mis razones para querer que una línea curva pase por los puntos es que quiero "suavizar" la transición entre vértices en un gráfico de líneas que he escrito. Antes que nadie lo mencione.JFree Chart no es una opción. Entiendo que hay diferentes tipos de curvas y splines que se utilizan, pero no he tenido mucha suerte en comprender exactamente cómo funcionan o cómo implementar algo que se adapte a mis necesidades.

Estaría muy agradecido por cualquier ayuda ofrecida - Gracias de antemano.

Respuestas a la pregunta(3)

Su respuesta a la pregunta