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
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
.
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%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.