Dessinez la courbe de Bézier avec Go

Dessinez la courbe de Bézier avec Go

Je voudrais donner une explication détaillée, mais pour le moment le code source

Code source

package bezier

import (
  "math"
)

type Point struct{
  X,Y float64
}

// n! (n étage)
func factorial(n int)(int){
  if n == 0{
    return 1
  }
  return n * factorial(n-1)
}

func biCoe(n,i int)(float64){
  return float64(factorial(n) / (factorial(n-i) * factorial(i)))
}

func bernstein(n,i int,t float64)(float64){
  var N float64 = float64(n)
  var I float64 = float64(i)
  return biCoe(n,i) * math.Pow(t,I ) * math.Pow(1-t,N-I)
}

func BezierCurve(p []Point,t float64)(result Point){
  for i,v := range p{
    B := bernstein(len(p)-1,i,t)
    result.X += v.X*B
    result.Y += v.Y*B
  }
  return
}

//Si la valeur de changement est augmentée, a devient une courbe nette.
func Curve(p []Point,a float64)(result []Point){
  var t float64
  for {
    result = append(result, BezierCurve(p,t) )
    t += a
    if t >= 1{
      break
    }
  }
  return
}

Curve ([] Point, float64) est une fonction qui donne le point de contrôle et la quantité de changement de t et renvoie une tranche de P (t, 0> = t <= 1).

L'utilisateur dessine généralement en utilisant cette fonction (en supposant que).

Exemple d'utilisation

package bezier

import (
  "testing"
  "github.com/fogleman/gg"
)

func TestBezierCurve(t *testing.T){
  //Point de contrôle
  P := []Point{Point{10,10},Point{10,590},Point{590,590}}

  //Montant du changement
  const A = 0.01
  result := Curve(P,A)

  dc := gg.NewContext(600,600)
  dc.SetHexColor("#fff")
  dc.Clear()

  //Dessiner des points de contrôle
  dc.Push()
  dc.SetHexColor("#0000ff")
  for _,v :=range P{
    dc.DrawCircle(v.X,v.Y,4)
    dc.Fill()
  }
  dc.Pop()

  //Tracez une courbe
  dc.Push()
  dc.SetHexColor("#000")
  //Aller au point de départ
  dc.MoveTo(P[0].X,P[0].Y)
  for _,v :=range result{
    dc.LineTo(v.X,v.Y)
  }
  dc.Stroke()
  dc.Pop()

  // P(t)Dessin de
  dc.Push()
  dc.SetHexColor("#f01000")
  for _,v :=range result{
    dc.DrawCircle(v.X,v.Y,3)
  }
  dc.Stroke()
  dc.Pop()

  dc.SavePNG("out.png ")
}

Résultat de l'exécution du test

実行結果

Le point bleu est le point de contrôle et le rouge est le cercle centré sur les coordonnées P (t).

en conclusion

Je ne suis pas bon en mathématiques, mais j'ai trouvé une implémentation en quelques heures (trop de temps) en jetant un coup d'œil aux formules mathématiques. Il y avait un grand sentiment d'accomplissement. (Impression d'élèves du primaire)

Je voudrais le mettre à jour petit à petit quand je vais bien.

J'espère que cet article sera utile à quelqu'un.

Merci

Je suis toujours redevable à http://github.com/fogleman/gg.

L'article de @Rahariku a été très utile. Merci beaucoup.

référence

Recommended Posts

Dessinez la courbe de Bézier avec Go
Python avec Go
Faire fonctionner le conteneur Db2 avec Go
Dessinez un graphique avec NetworkX
Premiers pas avec Go Assembly
Dessinez bonjour le monde avec mod_wsgi
Dessiner un fichier netCDF avec python
Recherche de bits complète avec Go
Connectez-vous à Postgresql avec GO
Essayez d'implémenter le parfum avec Go
Dessinez un graphique avec networkx
Dessinez des sprites non flous avec cocos2d / pyglet
Tracez un graphe avec Julia + PyQtGraph (2)
Essayez de dessiner une courbe de Bézier
Allez voir les baleines avec l'optimisation des combinaisons
Conseils pour exécuter Go avec Docker
Dessinez le japonais avec matplotlib sur Ubuntu
Dessinez un graphique lâche avec matplotlib
Dessinez un beau cercle avec numpy
Tracez un graphique avec Julia + PyQtGraph (1)
Dessinez un graphique avec Julia + PyQtGraph (3)
Dessinez une courbe Koch avec Python Turtle
Utiliser la bibliothèque curl / jq avec Go
Dessinez un graphique avec des pandas + XlsxWriter
Dessinez une illustration avec Python + OpenCV
Dessinez facilement des graphiques avec matplotlib
Dessinez Riapnov Fractal avec Python, matplotlib
Dessinez un graphique avec l'interface graphique PySimple
Dessinez avec PyOpenGL. Confusion autour de VBO
Dessinez facilement une carte avec matplotlib.basemap
Dessinez des figures avec OpenCV et PIL
Dessinez une flèche (vecteur) avec opencv / python
Exploitez l'espace de noms réseau Linux avec Go