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.
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.
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.
Ist die Bestellung
Wenn die Reihenfolge beispielsweise 3 ist, können Sie eine kubische Bezier-Kurve zeichnen.
Wenn die Reihenfolge erhöht wird, wird die Form komplizierter.
Bimetrischer Koeffizient Der auf der rechten Seite von $ B_ {n, i} (t) $ berechnete Koeffiziententeil wird als Binomialkoeffizient bezeichnet und nach der folgenden Formel berechnet.
\begin{pmatrix} n\\i \end{pmatrix} = {_n\mathrm{C}_k=\frac{n!}{k!(n-k)!} } \tag{3}
$ (2) $ wird auch als Bernstein-Polymorphismus bezeichnet.
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)
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.
Recommended Posts