[PYTHON] Essayez de dessiner une courbe de Bézier

introduction

J'étudiais le traitement de formes, mais je n'arrivais pas à y arriver juste en lisant un livre, alors j'ai décidé d'essayer la programmation.

Quelle est la courbe de Bézier?

La courbe de Bézier est une forme courbe créée dans le polygone de contrôle formé en reliant les points de contrôle $ P_i $. Un point qui compose la courbe de Bézier est défini par les points de contrôle et les paramètres, et en les reliant, la courbe de Bézier comme indiqué dans la figure ci-dessous peut être dessinée. Le point bleu est le point de contrôle. image.png

Calcul de la courbe de Bézier

Cette fois, nous ciblons la courbe de Bézier dessinée dans un espace bidimensionnel. Ainsi, la composante de la valeur de coordonnée est $ (X_i, Y_i) $.

Tout d'abord, la courbe de Bézier est définie par la formule suivante. Avec cette formule, une fois que $ t $ est déterminé, le point $ P (t) $ sur la courbe de Bézier peut être calculé. Calculez le point $ P (t) $ en changeant $ t $ dans la plage de 0 à 1, et connectez-les pour former une courbe de Bézier.

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}

Il existe différents symboles tels que $ t $ et $ N $, mais la signification de chacun est la suivante.

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

De plus, $ (2) $ est appelé le polymorphisme de Bernstein.

programme

Le script python implémenté est le suivant.

#Calcul du coefficient binaire
def BiCoe(n, k):
    if n < k :
        return -1
    return math.factorial(n) / (math.factorial(k) * math.factorial((n - k)))

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

#Courbe de Bézier
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 partie de dessin de courbe

#Dessiner la courbe de Bézier
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)

en conclusion

Quand j'ai lu ce livre, j'ai trouvé stupide de dire: "Puis-je dessiner une courbe avec cette formule?" Je pense que cela s'est approfondi. En tant que maniaque des mathématiques, il m'a fallu beaucoup de temps pour faire des recherches et comprendre un peu. .. .. Par exemple, il a fallu environ 30 minutes pour savoir que la partie coefficient est un coefficient binomial en regardant la formule de $ (2) $. (LOL) Je vais continuer à étudier dur.

Les références

Recommended Posts

Essayez de dessiner une courbe de Bézier
Essayez de dessiner une courbe de vie avec python
Essayez de sélectionner une langue
Comment dessiner un graphique avec Matplotlib
Faisons un noyau jupyter
Calculons en fait le problème statistique avec Python
Comment dessiner un graphique à 2 axes avec pyplot
Comment dessiner un graphique 3D avant l'optimisation
Je voulais jouer avec la courbe de Bézier
Essayez de créer un code de "décryptage" en Python
Exemple pour dessiner une horloge simple en utilisant ebiten
Essayez de créer une nouvelle commande sous Linux
Essayez de créer un groupe de dièdre avec Python
[Python] Comment dessiner un histogramme avec Matplotlib
Écrivons un script de confirmation ping de manière appropriée
Essayez de dessiner un "front de type carte météorologique" par apprentissage automatique basé sur des données météorologiques (5)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur les données météorologiques (3)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (1)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (4)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (2)
Essayez de créer un module Python en langage C
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Faisons un outil de veille de commande avec python
Essayez de créer un Checkbutton dynamiquement avec Tkinter en Python
(Python) Essayez de développer une application Web en utilisant Django
Essayez d'implémenter yolact
Un échantillon pour essayer rapidement les machines de factorisation avec fastFM
Les débutants en apprentissage automatique essaient de créer un arbre de décision
[Python] Comment dessiner un diagramme de dispersion avec Matplotlib
Dérivés appris en utilisant Python - (2) Draw Yield Curve (JPYLibor Curve) -
J'ai essayé de dessiner un diagramme de configuration à l'aide de diagrammes
Je veux trouver l'intersection d'une courbe de Bézier et d'une ligne droite (méthode de découpage de Bézier)
[Go language] Essayez de créer un compteur de lignes inutilement multithread
Essayez de créer un réseau de neurones / d'apprentissage en profondeur avec scratch
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Essayez de modéliser une distribution multimodale à l'aide de l'algorithme EM
[Visualisation] Je veux dessiner un beau graphique avec Plotly
[Introduction à Tensorflow] Comprendre correctement Tensorflow et essayer de créer un modèle
Essayez simplement de recevoir un webhook avec ngrok et Python
Essayez de défier le sol par récursif
Dessinez la courbe de Bézier avec Go
Dessinez un graphique avec NetworkX
Une route vers Python intermédiaire
Une super introduction à Linux
Essayez d'analyser les tendances Twitter
Essayez de programmer avec un shell!
Essayez de comprendre Python soi
Ajouter un dictionnaire à MeCab
Comment appeler une fonction
Télécharger un fichier sur Dropbox
Envoyer un signal au sous-processus
Essayons un script shell
Comment pirater un terminal
Essayez de dessiner une fonction logistique
Dessinez un cœur en Python
Dessinez un graphique avec networkx
[Langage C] [Linux] Essayez de créer une simple commande Linux * Ajoutez simplement! !!