Ich möchte eine ausführliche Erklärung geben, aber vorerst den Quellcode
package bezier
import (
"math"
)
type Point struct{
X,Y float64
}
// n! (n Etage)
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
}
//Wenn der Änderungswert erhöht wird, wird a zu einer scharfen Kurve.
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) ist eine Funktion, die den Kontrollpunkt und den Änderungsbetrag in t angibt und eine Scheibe von P zurückgibt (t, 0> = t <= 1).
Der Benutzer zeichnet normalerweise mit dieser Funktion (vorausgesetzt, dass).
package bezier
import (
"testing"
"github.com/fogleman/gg"
)
func TestBezierCurve(t *testing.T){
//Kontrollpunkt
P := []Point{Point{10,10},Point{10,590},Point{590,590}}
//Änderungsbetrag
const A = 0.01
result := Curve(P,A)
dc := gg.NewContext(600,600)
dc.SetHexColor("#fff")
dc.Clear()
//Kontrollpunkte zeichnen
dc.Push()
dc.SetHexColor("#0000ff")
for _,v :=range P{
dc.DrawCircle(v.X,v.Y,4)
dc.Fill()
}
dc.Pop()
//Zeichne eine Kurve
dc.Push()
dc.SetHexColor("#000")
//Gehen Sie zum Startpunkt
dc.MoveTo(P[0].X,P[0].Y)
for _,v :=range result{
dc.LineTo(v.X,v.Y)
}
dc.Stroke()
dc.Pop()
// P(t)Zeichnung von
dc.Push()
dc.SetHexColor("#f01000")
for _,v :=range result{
dc.DrawCircle(v.X,v.Y,3)
}
dc.Stroke()
dc.Pop()
dc.SavePNG("out.png ")
}
Der blaue Punkt ist der Kontrollpunkt und der rote ist der Kreis, der auf den P (t) -Koordinaten zentriert ist.
Ich bin nicht gut in Mathematik, aber ich habe in wenigen Stunden (zu viel Zeit) eine Implementierung gefunden, indem ich einen Blick auf mathematische Formeln geworfen habe. Es gab ein großes Erfolgserlebnis. (Eindruck von Grundschülern)
Ich möchte es nach und nach aktualisieren, wenn es mir gut geht.
Ich hoffe, dieser Artikel wird jemandem nützlich sein.
Ich bin immer http://github.com/fogleman/gg zu Dank verpflichtet.
Der Artikel von @Rahariku war sehr hilfreich. Vielen Dank.
Recommended Posts