[PYTHON] Versuchen Sie, eine Bezier-Kurve zu zeichnen

Einführung

Ich habe Formverarbeitung studiert, aber ich konnte es nicht richtig machen, indem ich ein Buch las, also habe ich beschlossen, es mit Programmieren zu versuchen.

Was ist die Bezier-Kurve?

Die Bezier-Kurve ist eine gekrümmte Form, die im Steuerpolygon erstellt wird, das durch Verbinden der Steuerpunkte $ P_i $ gebildet wird. Ein Punkt, aus dem die Bezier-Kurve besteht, wird durch die Kontrollpunkte und Parameter definiert. Durch Verbinden dieser Punkte kann die Bezier-Kurve wie in der folgenden Abbildung dargestellt gezeichnet werden. Der blaue Punkt ist der Kontrollpunkt. image.png

Bezierkurvenberechnung

Dieses Mal zielen wir auf die Bezier-Kurve, die in einem zweidimensionalen Raum gezeichnet ist. Die Komponente des Koordinatenwerts ist also $ (X_i, Y_i) $.

Zunächst wird die Bezier-Kurve durch die folgende Formel definiert. Mit dieser Formel kann, sobald $ t $ bestimmt ist, der Punkt $ P (t) $ auf der Bezier-Kurve berechnet werden. Berechnen Sie den Punkt $ P (t) $, indem Sie $ t $ im Bereich von 0 bis 1 ändern, und verbinden Sie sie, um eine Bezier-Kurve zu bilden.

P(t) = \sum_{i=0}^{N}B_{N,i}(t)Q_i \tag{1}
B_{n,i}(t) = \begin{pmatrix}n\\i\end{pmatrix}t^i(1-t)^{n-i} \tag{2}

Es gibt verschiedene Symbole wie $ t $ und $ N $, aber die Bedeutung ist jeweils wie folgt.

\begin{pmatrix} n\\i \end{pmatrix} = {_n\mathrm{C}_k=\frac{n!}{k!(n-k)!} } \tag{3}

$ (2) $ wird auch als Bernstein-Polymorphismus bezeichnet.

Programm

Das implementierte Python-Skript lautet wie folgt.

--Begger-Kurvenberechnungsteil

#Berechnung des Binärkoeffizienten
def BiCoe(n, k):
    if n < k :
        return -1
    return math.factorial(n) / (math.factorial(k) * math.factorial((n - k)))

#Bernstein-Polypoly
def Bernstein(n, i, t):
    return BiCoe(n, i) * np.power((1-t), (n-i)) * np.power(t, i)

#Bezier-Kurve
def BezierCurve(points, t):
    Gt = 0
    n = len(points) - 1
    for k, point in enumerate(points):
        Gt += point * Bernstein(n, k, t)
            
    return Gt

--Begger Kurvenzeichnungsteil

#Bezier-Kurve zeichnen
def DrawBezierCurve(points):
    x = np.arange(0, 1, 0.01, dtype=np.float32)
    x = np.append(x, 1.0)
    gt = [BezierCurve(points, t) for t in x]
    gt_x = [g[0] for g in gt]
    gt_y = [g[1] for g in gt]
    ct_x = [ct[0] for ct in points]
    ct_y = [ct[1] for ct in points]
    
    plt.plot(ct_x, ct_y, linestyle='dashed', linewidth=1)
    plt.plot(gt_x, gt_y, linewidth = 3)
    plt.scatter(ct_x, ct_y)

abschließend

Als ich dieses Buch las, fand ich es dumm zu sagen: "Kann ich mit dieser Formel eine Kurve zeichnen?" Ich denke, es hat sich vertieft. Als Mathematikbegeisterter habe ich lange gebraucht, um ein wenig zu recherchieren und zu verstehen. .. .. Zum Beispiel dauerte es ungefähr 30 Minuten, um zu erkennen, dass der Koeffiziententeil ein Binomialkoeffizient ist, indem man sich die Formel von $ (2) $ ansieht. (LOL) Ich werde weiter hart lernen.

Verweise

Recommended Posts

Versuchen Sie, eine Bezier-Kurve zu zeichnen
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Versuchen Sie, eine Sprache auszuwählen
So zeichnen Sie ein Diagramm mit Matplotlib
Machen wir einen Jupyter-Kernel
Berechnen wir das statistische Problem mit Python
So zeichnen Sie ein 2-Achsen-Diagramm mit Pyplot
So zeichnen Sie vor der Optimierung ein 3D-Diagramm
Ich wollte mit der Bezier-Kurve spielen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Beispiel zum Zeichnen einer einfachen Uhr mit ebiten
Versuchen Sie, einen neuen Befehl unter Linux zu erstellen
Versuchen Sie, mit Python eine Diedergruppe zu bilden
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Schreiben wir ein entsprechendes Ping-Bestätigungsskript
Versuchen Sie, durch maschinelles Lernen basierend auf Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (5)
Versuchen Sie, durch maschinelles Lernen anhand von Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (3).
Versuchen Sie, durch maschinelles Lernen basierend auf Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (1)
Versuchen Sie, durch maschinelles Lernen anhand von Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (4)
Versuchen Sie, durch maschinelles Lernen basierend auf Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (2)
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Versuchen Sie, mit Tkinter in Python dynamisch einen Checkbutton zu erstellen
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Versuchen Sie, yolact zu implementieren
Ein Beispiel, um Faktorisierungsmaschinen schnell mit fastFM auszuprobieren
Anfänger des maschinellen Lernens versuchen, einen Entscheidungsbaum zu erstellen
[Python] Wie zeichnet man mit Matplotlib ein Streudiagramm?
Mit Python erlernte Derivate- (2) Zeichnen Sie eine Zinsstrukturkurve (JPYLibor-Kurve) -
Ich habe versucht, ein Konfigurationsdiagramm mit Diagrammen zu zeichnen
Ich möchte den Schnittpunkt einer Bezier-Kurve und einer geraden Linie finden (Bezier-Clipping-Methode)
[Go language] Versuchen Sie, einen nutzlos zählbaren Zähler mit mehreren Threads zu erstellen
Versuchen Sie, ein Deep Learning / Neuronales Netzwerk mit Scratch aufzubauen
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Versuchen Sie, eine multimodale Verteilung mithilfe des EM-Algorithmus zu modellieren
[Visualisierung] Ich möchte mit Plotly ein schönes Diagramm zeichnen
[Einführung in Tensorflow] Verstehen Sie Tensorflow richtig und versuchen Sie, ein Modell zu erstellen
Versuchen Sie einfach, einen Webhook mit ngrok und Python zu erhalten
Versuchen Sie, den Boden durch Rekursion herauszufordern
Zeichnen Sie die Bezier-Kurve mit Go
Zeichnen Sie mit NetworkX ein Diagramm
Ein Weg zum mittleren Python
Eine super Einführung in Linux
Versuchen Sie, Twitter-Trends zu analysieren
Versuchen Sie, mit einer Shell zu programmieren!
Versuchen Sie, Python selbst zu verstehen
Fügen Sie MeCab ein Wörterbuch hinzu
So rufen Sie eine Funktion auf
Laden Sie eine Datei in Dropbox hoch
Senden Sie ein Signal an den Unterprozess
Versuchen wir es mit einem Shell-Skript
Wie man ein Terminal hackt
Versuchen Sie, eine logistische Funktion zu zeichnen
Zeichne ein Herz in Python
Zeichnen Sie mit networkx ein Diagramm
[C-Sprache] [Linux] Versuchen Sie, einen einfachen Linux-Befehl zu erstellen. * Fügen Sie einfach hinzu! !!