Wie wird eine Linie (oder Kurve) äquidistant neu abgetastet?

8

Ich habe eine Zeile l_1 mit einer Punktfolge p_1,...,p_n angegeben. Ich möchte jetzt eine neue Zeile l_2 mit k punkte: q_1,...,q_k. Aber für alle i \in {1,...,k-1}: abs( q_i - q_i+1 ) = const , was bedeutet, dass die Segmente von l_2 äquidistant oder einheitlich sind.

  • k >= 2
  • und p_1 und p_n sollten in l_2 sein.
  • abs( p_i - p_i+1 ) nicht const

Eine Lösung besteht darin, eine Linie mit einem Spline anzunähern und dann erneut zu unterteilen, um dann Segmente mit einheitlicher Länge zu erhalten. Kann ich es besser machen? Gibt es einen C ++ Code dafür?

Ah, ich habe ein spezifisches Detail übersehen: Diese q_i sollten in l_1 sein, was bedeutet, dass sie entweder in den Liniensegmenten von l_1 oder sie sind Beispielpunkte von l_1 .

    
math 29.10.2010, 13:17
quelle

2 Antworten

7

Verwenden einer parametrischen Funktion

Sie können eine stückweise parametrische Funktion definieren:

%Vor%

Wählen Sie dann Ihre Punkte q, idealerweise kleiner als das Minimum p [i + 1] -p [i]

Abschließend f [q] in gleichen t Intervallen abtasten.

Beispielergebnis:

Hier sehen Sie den Effekt der Reduzierung der Intervallgröße vom größten zum kleinsten im Original-Sample:

Sie können die Güte der Näherung auswerten, indem Sie die Bereiche (Integrieren) zwischen der ursprünglichen und der neu abgetasteten Kurve aufaddieren:

Wenn Sie die Integrale für verschiedene Intervallgrößen plotten, können Sie entscheiden, was eine gute Stichprobe ist:

Nur zur Erinnerung, der Code in Mathematica ist:

%Vor%

Bearbeiten: Beantworten Sie Ihren Kommentar

Kommentierter PKG-Code:

%Vor%     
Dr. belisarius 29.10.2010, 15:10
quelle
2

Es hängt von Ihren Linienpunkten ab - was sind sie? Wenn sie eine glatte Linie definieren, ist das Resampling eines kubischen Splines eine gute Wahl.

Wenn Sie die Punkte im gleichen Abstand halten, müssen Sie im Wesentlichen definieren, was Sie zwischen den Punkten sehen möchten - ist Glätte wichtiger als die ursprüngliche Linie zu wahren? Gibt es eine Geschwindigkeitsbeschränkung?

Soweit ich sehen kann, enden Sie wahrscheinlich hier mit einem iterativen Prozess, denn wenn Ihre ursprünglichen Punkte eine glatte Linie definieren, ist es nicht einfach, die Länge dieser Linie zu berechnen, geschweige denn, sie aufzuteilen in gleiche Teile und bestimmen die Koordinaten dieser Punkte.

Wenn Sie kubische Splines verwenden, sollten Sie für jeden Spline die Länge über die Formel auf Wikipedia Artikel über die Bogenlänge . Es erfordert jedoch, dass Sie die Integration durchführen - wenn Sie numerische Integration tun, wird es als Quadratur bekannt. Für ein kubisches (um die Länge eines Liniensegments zwischen zwei ursprünglichen Punkten zu berechnen), sollte dies als eine gewichtete Summe der Koeffizienten des kubischen Splines enden - insbesondere wenn Sie eine Gaußsche Quadratur verwenden.

Sie könnten jedoch wahrscheinlich eine vernünftige Antwort mit stückweisen kubischen Polynomen erhalten (erzeugen Sie ein kubisches Polynom aus 2 Punkten und den 2 Punkten auf beiden Seiten) und einen iterativen Algorithmus, der Schätzwerte von xi verbessert, um äquidistante Punkte zu erhalten. Aber das setzt voraus, dass Sie eher Geschwindigkeit als Genauigkeit wünschen.

    
Phil H 29.10.2010 15:32
quelle

Tags und Links