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