Zeichnen Sie die Bezier-Kurve mit Go

Zeichnen Sie die Bezier-Kurve mit Go

Ich möchte eine ausführliche Erklärung geben, aber vorerst den Quellcode

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).

Anwendungsbeispiel

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 ")
}

Ergebnis der Testausführung

実行結果

Der blaue Punkt ist der Kontrollpunkt und der rote ist der Kreis, der auf den P (t) -Koordinaten zentriert ist.

abschließend

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.

Vielen Dank

Ich bin immer http://github.com/fogleman/gg zu Dank verpflichtet.

Der Artikel von @Rahariku war sehr hilfreich. Vielen Dank.

Referenz

Recommended Posts

Zeichnen Sie die Bezier-Kurve mit Go
Python mit Go
Betreiben Sie den Db2-Container mit Go
Zeichnen Sie mit NetworkX ein Diagramm
Erste Schritte mit Go Assembly
Zeichne Hallo Welt mit mod_wsgi
Zeichnen Sie eine netCDF-Datei mit Python
Vollbit-Suche mit Go
Stellen Sie mit GO eine Verbindung zu Postgresql her
Versuchen Sie, Parfüm mit Go zu implementieren
Zeichnen Sie mit networkx ein Diagramm
Zeichne unscharfe Sprites mit cocos2d / pyglet
Zeichne ein Diagramm mit Julia + PyQtGraph (2)
Versuchen Sie, eine Bezier-Kurve zu zeichnen
Sehen Sie sich Wale mit Kombinationsoptimierung an
Tipps zum Ausführen Gehen Sie mit Docker
Zeichne Japanisch mit matplotlib auf Ubuntu
Zeichnen Sie mit matplotlib ein loses Diagramm
Zeichne einen schönen Kreis mit Numpy
Zeichne ein Diagramm mit Julia + PyQtGraph (1)
Zeichne ein Diagramm mit Julia + PyQtGraph (3)
Zeichnen Sie mit Python Turtle eine Koch-Kurve
Verwenden Sie die Curl / JQ-Bibliothek mit Go
Zeichnen Sie ein Diagramm mit Pandas + XlsxWriter
Zeichnen Sie eine Illustration mit Python + OpenCV
Zeichnen Sie einfach Diagramme mit matplotlib
Zeichne Riapnov Fractal mit Python, matplotlib
Zeichnen Sie ein Diagramm mit der PySimple-Benutzeroberfläche
Zeichnen Sie mit PyOpenGL. Verwirrung um VBO
Zeichnen Sie einfach eine Karte mit matplotlib.basemap
Zeichnen Sie Figuren mit OpenCV und PIL
Zeichnen Sie einen Pfeil (Vektor) mit opencv / python
Betreiben Sie den Linux-Netzwerk-Namespace mit Go