Heim >Backend-Entwicklung >Python-Tutorial >Wie können Daten mit einer kubischen Bézier-Kurve mit mehreren Segmenten angenähert werden, die durch Abstand und Krümmung eingeschränkt ist?

Wie können Daten mit einer kubischen Bézier-Kurve mit mehreren Segmenten angenähert werden, die durch Abstand und Krümmung eingeschränkt ist?

Barbara Streisand
Barbara StreisandOriginal
2024-10-21 08:30:03683Durchsuche

How to Approximate Data with a Multi-Segment Cubic Bezier Curve Constrained by Distance and Curvature?

Approximieren von Daten mit einer mehrsegmentigen kubischen Bezier-Kurve mit Abstands- und Krümmungsbeschränkungen

Problemstellung:

Das Ziel besteht darin, gegebene geografische Datenpunkte mit einer mehrsegmentigen kubischen Bezier-Kurve unter zwei Einschränkungen anzunähern:

  1. Der maximale Abstand zwischen der Kurve und den Datenpunkten darf eine festgelegte Toleranz nicht überschreiten.
  2. Die Krümmung der Kurve darf eine bestimmte Schärfe nicht überschreiten.

Lösung:

Es wird eine zweistufige Lösung vorgeschlagen:

  1. Erstellen Sie eine B-Spline-Näherung:

    • Verwenden Sie die FITPACK-Bibliothek (Zugriff über die Scipy-Python-Bindung), um eine B-Spline-Näherung zu erstellen. Spline, der die Datenpunkte nach der Methode der kleinsten Quadrate anpasst.
    • B-Splines ermöglichen die Angabe der Glätte und bieten eine Möglichkeit, die Krümmungsbeschränkung zu erfüllen.
  2. B-Spline in Bezier-Kurve konvertieren:

    • Verwenden Sie eine Funktion wie die im Lösungstext bereitgestellte, um den B-Spline in eine mehrsegmentige Bezier-Kurve umzuwandeln.
    • Die konvertierte Bezier-Kurve erbt die Glätte- und Krümmungseigenschaften des B-Spline.

Codebeispiel:

Hier ist ein Python-Snippet, das den Ansatz demonstriert:

<code class="python">import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

# Assume the data points are stored in lists x and y.

# Create B-spline approximation
tck, u = interpolate.splprep([x, y], s=3)  # Adjust s parameter for smoothness

# Generate new parameter values for plotting
unew = np.arange(0, 1.01, 0.01)

# Evaluate B-spline at new parameter values
out = interpolate.splev(unew, tck)

# Convert B-spline to Bezier curve
bezier_points = b_spline_to_bezier_series(tck)

# Plot the data points, B-spline, and Bezier curve
plt.figure()
plt.plot(x, y, out[0], out[1], *bezier_points)  # Replace * with individual Bezier curves
plt.show()</code>

Hinweis:

Die Lösung priorisiert Glätte vor Genauigkeit. Für engere Näherungen kann es erforderlich sein, eine gewisse Glätte in Kauf zu nehmen, um sicherzustellen, dass die Abstandsbeschränkung eingehalten wird.

Das obige ist der detaillierte Inhalt vonWie können Daten mit einer kubischen Bézier-Kurve mit mehreren Segmenten angenähert werden, die durch Abstand und Krümmung eingeschränkt ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn