So erstellen Sie eine Linienkurve durch Punkte

Ich suche nach einer Möglichkeit, eine Linienkurve durch eine Reihe von Punkten zu erstellen. Es wäre vorzuziehen, 3 Punkte zu verwenden, obwohl ich in Betracht gezogen habe, dass, um dem Winkel der Linie, die in einen Punkt eintritt, einen Kontext zu geben, mehr erforderlich sein kann, um der Kurve sozusagen einen Kontext zu geben.

Im Allgemeinen sollte die Linie als Startpunkt P1, Kontrollpunkt P2 und Endpunkt P3 von P1 nach P2 und dann von P2 nach P3 gekrümmt sein.

In der Tat ist hier ein perfektes Beispiel für den Effekt, den ich erreichen möchte:

Wenn ich das könnte, wäre ich wirklich auf ewig dankbar!

In Java habe ich bisher versucht, mit Dingen wie herumzuspielenQuadCurve2D.Double , Cub icCurve2D.Double und auchPath2D.Double (Verwenden von curveTo mit Path2D.Double), aber ohne Erfolg - Die gezeichneten Kurven durchlaufen den angegebenen Kontrollpunkt nicht einmal annähernd.

Hier ist ein Bild der Methoden, die ich bisher ausprobiert habe:

Und hier ist der Code, mit dem ich die Punkte und Kurven im Bild erzeugt habe:

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

Meine Gründe dafür, dass eine gekrümmte Linie durch Punkte verlaufen soll, sind, dass ich den Übergang zwischen Scheitelpunkten in einem von mir geschriebenen Liniendiagramm "glätten" möchte. Bevor es jemand erwähntJFree Chart ist keine Option. Ich verstehe, dass es verschiedene Arten von Kurven und Splines gibt, aber ich hatte nicht viel Glück, genau zu verstehen, wie sie funktionieren oder wie ich etwas implementieren kann, das meinen Bedürfnissen entspricht.

Für jede Hilfe wäre ich sehr dankbar - vielen Dank im Voraus.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage