Wie man eine Linie durch Punkte schneidet

8

Ich suche nach einer Möglichkeit, eine Linienkurve durch eine Anzahl von Punkten zu machen. Es wäre vorzuziehen, 3 Punkte zu verwenden, obwohl ich berücksichtigt habe, dass, um dem Winkel der Linie, die in einen Punkt eintritt, Kontext zu geben, mehr benötigt werden kann, um der Kurve sozusagen einen Kontext zu geben.

Im Allgemeinen sollte ein Startpunkt P1, ein Steuerpunkt P2 und ein Endpunkt P3 sein, die Linie sollte von P1 zu P2 und dann von P2 zu P3 gekrümmt sein.

Tatsächlich ist hier ein perfektes Beispiel für den Effekt, den ich erreichen möchte:

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

In Java habe ich bisher versucht, mit Dingen wie QuadCurve2D.Double , Cub icCurve2D. Double und Path2D.Double (mit curveTo mit Path2D.Double), aber ohne Erfolg - die Kurven, die gemalt sind, sind nicht einmal nahe daran, den angegebenen Kontrollpunkt zu durchlaufen.

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

Und hier ist der Code, den ich verwendet habe, um die Punkte und Kurven im Bild zu erzeugen:

%Vor%

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

Ich wäre wirklich dankbar für jede Hilfe angeboten - Vielen Dank im Voraus.

    
James C 07.04.2013, 16:00
quelle

3 Antworten

9

Ich denke, Sie vermissen die Idee, was ein Kontrollpunkt ist. Kontrollpunkte befinden sich in der Regel nicht auf dem Pfad selbst. Stattdessen steuern sie, wie die Kurve des Pfades zwischen Punkten geformt wird. Detaillierte Informationen finden Sie in einem Spline-Tutorial .

Nun zum Problem, Sie haben Punkte auf der Kurve, aber keine tatsächlichen Kontrollpunkte. Es gibt einige Techniken, wie zum Beispiel Cardinal Spline, um Kontrollpunkte abzuleiten, die dann an eine der von Ihnen erwähnten Kurvenzeichnungs-APIs übergeben werden. Wahrscheinlich möchten Sie die Option Path2D.Double , damit Sie einzelne Kurven problemlos aneinanderreihen können.

Also für das Zeichnen von P1 zu P2 zu P3 anstelle von

%Vor%

Sie möchten

%Vor%

Dabei sind die Koordinaten cx und cy Ihre abgeleiteten Kontrollpunkte, zwei Kontrollpunkte pro kubischem Spline-Segment. Möglicherweise,

%Vor%

Das Muster ist hier, dass für die inneren Punkte (nur P2 in diesem Fall) die Kontrollpunkte davor und danach (c1b und c2a) durch die Steigung der Linie zwischen den Punkten davor und danach versetzt sind (P1 und P3) ). Für die Kantenpunkte basieren die Kontrollpunkte auf der Neigung zwischen diesem Punkt und dem nächsten Punkt.

Wenn Sie domänenspezifische Informationen haben, können Sie verschiedene Kontrollpunkte auswählen. Zum Beispiel möchten Sie vielleicht die Steigungen an den Endpunkten auf 0 setzen.

    
xan 07.04.2013, 17:20
quelle
2

Nun, vielleicht könnte das helfen: P

Catmull-Rom Kurven nach dem Beispiel die gleichen Prinzipien verschiedene lang ... Ссылка

    
swirm 07.04.2013 16:41
quelle
2

Im Grunde ist es das, wonach Sie fragen, ist Cubic Spline Interpolation , ich konnte dieses Programm online finden Interp2.java . Es enthält tatsächlich einen Polynomspline und einen kubischen Spline.

Leider ist es ein Applet und keine tatsächliche Klasse, aber Sie können immer noch durch den Code schauen, wie Sie es gemacht haben. Was immer gut ist.

    
Joban Dhillon 07.04.2013 17:11
quelle

Tags und Links