Je voudrais donner une explication détaillée, mais pour le moment le 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).
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 ")
}

Le point bleu est le point de contrôle et le rouge est le cercle centré sur les coordonnées P (t).
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.
Je suis toujours redevable à http://github.com/fogleman/gg.
L'article de @Rahariku a été très utile. Merci beaucoup.
Recommended Posts