2016-03-30 15 views
0

Ich versuche, einen Algorithmus zu finden, um eine glatte Kurve zu zeichnen, die durch n Punkte in Java verläuft.Linkpunkte mit einer glatten Kurve

Ich lese viel über das Thema, aber ich finde nur Beispiele mit 3 oder 4 Punkten. Ich verstehe nicht, wie ich den Prozess mit mehr Punkten verallgemeinern soll.

Zum Beispiel fand ich that answer, die zeigt, wie man eine Bezier-Kurve mit 3 Punkten macht. Aber wenn ich den Vorgang mit den 3 nächsten Punkten wiederhole, werden die 2 Kurven nicht glatt zusammenlaufen.

Ich fand auch this interesting pdf, die im Detail den Prozess beschreibt. Der Teil, an dem ich interessiert bin, ist das 5. Kapitel über Interpolation durch kubische Splines. Es erklärt, wie man erreicht, was ich will, aber für 6 Punkte. Es gibt keine Verallgemeinerung für n Punkte.

Wenn Sie einen einfacheren Ansatz sehen, würde ich es gerne nehmen. Ich will nur keine Lagrange-Interpolation. Wie in der verknüpften pdf gezeigt, gibt es nicht gute Ergebnisse ...

+0

vorbei (dh in der Nähe) oder durchgehen (dh streng, direkt durch die Punkte)? Wie auch immer, schau hier rein: https://en.wikipedia.org/wiki/Cubic_Hermite_spline –

+0

Passing through (sorry, nicht meine Muttersprache). Danke für den Link. Sieht immer noch nicht so einfach aus, wie ich es erwartet hatte. Ich werde mehr Zeit brauchen, um mich an all dem zu beteiligen. – Sharcoux

+0

verbinden Sie alle Punkte mit Linien. Finde an jedem Eckpunkt den mittleren Winkel und verwende ihn als Tangentenrichtung. Verwenden Sie für die beiden Kantentangenten die Akkordrichtungen selbst. Sollte einfach genug sein. Jedes Segment wird durch seine zwei Kantenpunkte und zwei Tangentenrichtungen definiert. –

Antwort

0

Sie beide kurze Einführung in die kubische Splines und gute praktische Umsetzung in this chapter des Buches Numerische Methoden in der C kann

finden Sie verwenden Catmull-Rom splines (sie nur für die erste Ableitung Glätte liefern) auch

One more simple approach für die Interpolation mit Bezier-Kurven vorgeschlagen von Maxim Shemanarev

+0

Vielen Dank für diese Links. Ich werde das alles lesen und zu dir zurückkommen. Es wird wahrscheinlich einige Male dauern, um alles zu verstehen. – Sharcoux

0

Sie erwähnen nicht, was für Sie glatt bedeutet (was für Kontinuität c0, c1, c2 ...?), Aber in den meisten Fällen sind für die visuelle Glätte Kubikfelder ausreichend (4-Punkt-Kurven).

Wenn Sie wollen, dass Ihre Kurve durch alle Punkte geht, dann wollen Sie Interpolation statt Approximation, also BEZIER/SPLINE ist kein Weg (es sei denn, einige zusätzliche Berechnungen werden eingeführt).

Also Ihre Frage kocht auf 2 Dinge. Welche Polynomkurve zu verwenden und wie Sie mehrere von ihnen reibungslos zusammenfügen. Um dies zu erreichen, müssen Sie die Kontrollpunkte in einer bestimmten Reihenfolge ablaufen lassen. Stand dieser Fragen werden hier beantwortet:

  • Proper implementation of cubic spline interpolation

    Das Interpolationspolynom verwendet es in einer Art und Weise aufgebaut ist, dass sie durch alle Kontrollpunkte geht und erste Ableitung ist glatt verbunden an beiden Enden, wenn mehrere solcher Kurven sind zusammengesetzt. Die Punktaufrufsequenz ist dieselbe wie für BEZIER/SPLINE.

    Wenn Sie wollen/müssen BEZIER statt Interpolation verwenden (zum Beispiel GDI dafür Rendering zu verwenden) und wollen immer noch die Kurve alle Punkte durchlaufen Sie, dass die Interpolation cubics von mir in BEZIER umwandeln kann (es ist eine Form von Catmull-Rom-Splines) Sie konvertieren nur die Kontrollpunkte in neue, so BEZIER entspricht der gleichen Form.Es ist leicht, wie dies geschehen:

  • how to convert interpolation cubic polynomial to cubic BEZIER

Hier können Sie Beispielbilder finden, wie die verbundenen Kurven sieht aus wie

+0

Vielen Dank für Ihre Antwort. Es gibt viel zu lernen, also werde ich nicht tiefer antworten, bevor ich ein paar Tests mache. Aber ich verstehe nicht, warum du sagst, dass ich interpolieren will und so ist Bezier/Spline keine Lösung. Das Kapitel 5 der pdf, die ich gab, zeigt, dass es möglich ist, denke ich? – Sharcoux

+0

BEZIER und SPLINE sind Näherungskurven, dh sie nähern sich normalerweise nur Kontrollpunkten und müssen diese nicht unbedingt kreuzen. Es gibt spezielle Arten von Splines wie Catmul-Rom, die die Interpolation mit BEZIER durchführen, aber Sie können das als Fix für die Approximation betrachten. Das Ergebnis ist mehr oder weniger dasselbe wie die direkte Verwendung/Konstruktion von Interpolationspolynomen, aber die Mathematik ist etwas komplexer. Wenn Sie nicht möchten, dass Ihre Kurve Ihre Punkte durchläuft und nur auf sie zugeht, können Sie BEZIER verwenden, aber Ihr Titel und Text legen nahe, dass Sie die Punkte direkt durchgehen möchten. – Spektre

+0

Sagen Bézier/Spline sind nicht geeignet für die Interpolation ist wirklich verwirrend (vor allem für Anfänger) und fast irreführend (obwohl ich verstehe, was du meintest). – fang

Verwandte Themen