Como fazer uma curva de linha através de pontos

Eu estou procurando uma maneira de fazer uma curva de linha através de um número de pontos. Seria preferível usar 3 pontos, embora eu tenha considerado que, para dar contexto ao ângulo da linha que entra em um ponto, mais pode ser necessário para dar contexto à curva, por assim dizer.

Em geral, um ponto inicial P1, um ponto de controle P2 e um ponto final P3, a linha deve se curvar para P2 a partir de P1 e então a curva de P2 para P3.

Na verdade, aqui está um exemplo perfeito do efeito que eu gostaria de alcançar:

Se eu pudesse fazer isso, eu seria eternamente grato!

Em Java, até agora, eu tentei brincar com coisas comoQuadCurve2D.Double , Cub icCurve2D.Double e tambémPath2D.Double (usando curveTo com Path2D.Double), mas sem sucesso - as curvas que são pintadas não estão nem perto de passar pelo ponto de controle especificado.

Aqui está uma imagem dos métodos que tentei até agora:

E aqui está o código que usei para gerar os pontos e curvas na imagem:

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

Minhas razões para querer uma linha curva para passar por pontos é que eu quero "suavizar" a transição entre vértices em um gráfico de linhas que escrevi. Antes que alguém mencioneJFree Chart não é uma opção. Eu entendo que existem diferentes tipos de curvas e splines que são usados, mas eu não tive muita sorte em entender exatamente como eles funcionam ou como implementar algo que atenda às minhas necessidades.

Eu ficaria muito grato por qualquer ajuda oferecida - Obrigado antecipadamente.

questionAnswers(3)

yourAnswerToTheQuestion