Documentation ¶
Overview ¶
Package mit Typen für grundlegende, geometrische 2D-Operationen.
Das Package geht von einer 2 dimensionalen Ebene aus, in welcher Punkte mittels X- und Y-Koordinaten (beides float64-Werte) bezeichnet werden. Es gibt zwei Datentypen für geometrische Objekte: Point und Rectangle und daneben den Datentyp Matrix, mit welchem linear affine Transformationen beschrieben und auf die Typen Point und Rectangle angewendet werden können.
Point ¶
Ein Punkt ist ein struct mit den Feldern X und Y für die X-, resp. die Y-Koordinate des Punktes. Beide Felder sind exportiert. Nahezu alle Methoden des Types Point haben einen Value-Receiver, d.h. sie verändern die Werte des Receivers nicht. Ich habe mich für den Begriff Point entschieden, obwohl es sich bei dieser Struktur genaugenommen um Vektoren handelt und viele der implementierten Methoden stark an das Rechnen mit Vektoren erinnern.
Erzeugen von Punkten ¶
Über die folgenden zwei Funktionen können Punkte erstellt werden:
NewPoint(x, y float64) (Point) NewPointIMG(p image.Point) (Point)
Beide Funktionen sind eigentlich überflüssig: dadurch dass die Felder X und Y in Point exportiert sind, können neue Punkte jederzeit über Struct-Literals erzeugt werden (z.B. geom.Point{1.0, 2.0}).
Modifikation von Punkten ¶
Mit den folgenden Methoden werden neue Punkte durch Modifikation bestehender Punkte erzeugt:
Add(q Point) (Point) AddXY(x, y float64) (Point) Sub(q Point) (Point) SubXY(x, y float64) (Point) Mul(k float64) (Point) Neg() (Point) Move(dp Point) // Pointer receiver! Verschiebt den Punkt selber
Die XY-Varianten der Methoden Add und Sub sind entstanden, da es oft einfacher ist zu schreiben:
p2 = p1.AddXY(1, 2)
als
p2 = p1.Add(geom.Point{1, 2})
Abstände ¶
Zwei Methoden stehen zur Bestimmung des euklidischen Abstandes zwischen zwei Punkten zur Verfügung. Dist2 liefert den Abstand im Quadrat, verzichtet aus Perf.gründen auf das Anwenden der Wurzel.
Distance(q Point) (float64) Dist2(q Point) (float64)
Checks ¶
Mit Eq werden zwei Punkte auf Identität geprüft. Mit In kann ermittelt werden, ob der Punkt innerhalb des Rechtecks r liegt. Beachte hierzu, wie die Koordinaten des Typs Rectangle zu verstehen sind.
Eq(q Point) (bool) In(r Rectangle) (bool)
Weitere Berechnungen ¶
Folgende Methoden stehen für weitergehende Berechnungen zur Verfügung:
Interpolate(q Point, t float64) (Point) Max(q Point) (Point) Min(q Point) (Point)
Konvertierung ¶
Folgende Methoden stehen zur Konvertierung (im weitesten Sinne) von Punkten zur Verfügung. Mit der Methode Set kann man bspw. die Koordinaten von Punkten via Flag oder Kommandozeile einlesen (Getter-Interface in flags).
AsCoord() (x, y float64) Int() (image.Point) String() (string) Set(s string) (error) // Pointer receiver!
Rectangle ¶
Der zweite geometrische Type ist Rectangle mit welchem ein rechteckiges Gebiet in einer 2-dimensionalen Ebene definiert werden kann. Der Typ besteht aus zwei (exportierten) Feldern Min und Max, welche die Eckpunkte eines Rechtecks enthaten. Dabei muss beachtet werden, dass immer folgendes gilt: Min.X <= Max.X UND Min.Y <= Max.Y.
Erzeugen von Rechtecken ¶
NewRectangle(x0, y0, x1, y1 float64) (Rectangle) NewRectangleWH(x, y, w, h float64) (Rectangle) NewRectangleCWH(mx, my, w, h float64) (Rectangle) NewRectangleIMG(r image.Rectangle) (Retangle)
Modifikation von Rechtecken ¶
Add(p Point) (Rectangle) Sub(p Point) (Rectangle) Move(dp Point) (Rectangle) // Pointer-Receiver
Checks und Vergleiche ¶
Empty() (bool) Eq(s Rectangle) (bool) In(s Rectangle) (bool) Overlaps(s Rectangle) (bool)
Grössen und spezielle Punkte ¶
Dx() (float64) Dy() (float64) Size() (Point)
Die folgenden Methoden dienen dazu, bestimmte Punkte auf dem Rand des Rechtecks einfacher zu ermitteln. Die Bezeichnungen entsprechen dabei den Angaben auf einem virtuellen Kompass. Bspw. bedeutet 'NW' Nordwest, bezeichnet also den linken oberen Punkt des Rechtecks.
NW() (Point) N() (Point) NE() (Point) W() (Point) C() (Point) E() (Point) SW() (Point) S() (Point) SE() (Point)
Weitere Berechnungen ¶
Intersect(s Rectangle) (Rectangle) Union(s Rectangle) (Rectangle) Inset(dx, dy float64) (Rectangle) PosRel(p Point) (fx, fy float64) RelPos(fx, fy float64) (Point) SetInside(p Point) (Point) Canon() (Rectangle)
Konvertierung ¶
AsCoord() (x, y, w, h float64) Int() (image.Rectangle) String() (string) Set(s string) (error)
Matrizen ¶
Der letzte Datentyp in diesem Package ist Matrix, mit welchem eine linear-affine Transformation in 2D dargestellt werden kann. Der Typ ist wiederum ein struct mit den Elementen m_11 bis m_23 einer 3x3 Matrix.
Basis-Matrizen ¶
Identity() (Matrix) Translate(d Point) (Matrix) Rotate(a float64) (Matrix) RotateAbout(rp Point, a float64) (Matrix) Scale(sx, sy float64) (Matrix) ScaleAbout(sp Point, sx, sy float64) (Matrix)
Verknüpfungen und Invertierung von Matrizen ¶
Multiply(b Matrix) (Matrix) Inv() (Matrix)
Transformation von Matrizen ¶
Translate(d Point) (Matrix) Scale(sx, sy float64) (Matrix) ScaleAbout(sp Point, sx, sy float64) (Matrix) Rotate(a float64) (Matrix) RotateAbout(rp Point, a float64) (Matrix)
Transformation von Punkten und Rechtecken ¶
Transform(p Point) (Point) TransformRect(r Rectangle) (Rectangle)
Diverse Methoden ¶
String() (string)
Index ¶
- type CubicSegment
- type LinearSegment
- type Matrix
- func (m Matrix) AsAff3() [6]float64
- func (m Matrix) AsMat3() [9]float64
- func (a Matrix) Inv() Matrix
- func (a Matrix) Multiply(b Matrix) Matrix
- func (m Matrix) Rotate(angle float64) Matrix
- func (m Matrix) RotateAbout(rp Point, a float64) Matrix
- func (m Matrix) Scale(sx, sy float64) Matrix
- func (m Matrix) ScaleAbout(sp Point, sx, sy float64) Matrix
- func (m Matrix) String() string
- func (m Matrix) Transform(p Point) Point
- func (m Matrix) TransformPoint(x, y float64) (float64, float64)
- func (m Matrix) TransformRect(r Rectangle) Rectangle
- func (m Matrix) TransformVector(x, y float64) (float64, float64)
- func (m Matrix) Translate(d Point) Matrix
- type Path
- func (p *Path) ArcLength() float64
- func (p *Path) ArcTime(len float64) float64
- func (p *Path) BezierTo(c0, c1, p1 Point)
- func (p *Path) Close()
- func (p *Path) Dir(t float64) Point
- func (p *Path) DirNorm(t float64) Point
- func (p *Path) End() Point
- func (p *Path) IsCyclic() bool
- func (p *Path) LineTo(p1 Point)
- func (p *Path) MoveTo(p0 Point)
- func (p *Path) Node(i int) Point
- func (p *Path) Nodes() int
- func (p *Path) Point(t float64) Point
- func (p *Path) PointNorm(t float64) Point
- func (p *Path) Segment(i int) Segment
- func (p *Path) Segments() int
- func (p *Path) Start() Point
- type Point
- func (p Point) Abs() float64
- func (p Point) Add(q Point) Point
- func (p Point) AddXY(x, y float64) Point
- func (p Point) Angle() float64
- func (p Point) AsCoord() (x, y float64)
- func (p Point) Dist2(q Point) float64
- func (p Point) Distance(q Point) float64
- func (p Point) Div(k float64) Point
- func (p Point) Eq(q Point) bool
- func (p Point) Fixed() fixed.Point26_6
- func (p Point) In(r Rectangle) bool
- func (p Point) Int() image.Point
- func (p Point) Interpolate(q Point, t float64) Point
- func (p Point) Max(q Point) Point
- func (p Point) Min(q Point) Point
- func (p *Point) Move(dp Point)
- func (p Point) Mul(k float64) Point
- func (p Point) Neg() Point
- func (p Point) Normalize() Point
- func (p *Point) Set(s string) error
- func (p Point) String() string
- func (p Point) Sub(q Point) Point
- func (p Point) SubXY(x, y float64) Point
- type QuadraSegment
- type Rectangle
- func (r Rectangle) Add(p Point) Rectangle
- func (r Rectangle) AsCoord() (x, y, w, h float64)
- func (r Rectangle) C() Point
- func (r Rectangle) Canon() Rectangle
- func (r Rectangle) Center() Point
- func (r Rectangle) Dx() float64
- func (r Rectangle) Dy() float64
- func (r Rectangle) E() Point
- func (r Rectangle) Empty() bool
- func (r Rectangle) Eq(s Rectangle) bool
- func (r Rectangle) In(s Rectangle) bool
- func (r Rectangle) Inset(dx, dy float64) Rectangle
- func (r Rectangle) Int() image.Rectangle
- func (r Rectangle) Intersect(s Rectangle) Rectangle
- func (r *Rectangle) Move(dp Point)
- func (r Rectangle) N() Point
- func (r Rectangle) NE() Point
- func (r Rectangle) NW() Point
- func (r Rectangle) Overlaps(s Rectangle) bool
- func (r Rectangle) PosRel(p Point) (float64, float64)
- func (r Rectangle) RelPos(fx, fy float64) Point
- func (r Rectangle) S() Point
- func (r Rectangle) SE() Point
- func (r Rectangle) SW() Point
- func (r *Rectangle) Set(s string) error
- func (r Rectangle) SetInside(p Point) Point
- func (r Rectangle) Size() Point
- func (r Rectangle) String() string
- func (r Rectangle) Sub(p Point) Rectangle
- func (r Rectangle) Union(s Rectangle) Rectangle
- func (r Rectangle) W() Point
- func (r Rectangle) X0() float64
- func (r Rectangle) X1() float64
- func (r Rectangle) Y0() float64
- func (r Rectangle) Y1() float64
- type Segment
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CubicSegment ¶
type CubicSegment struct {
P0, C0, C1, P1 Point
// contains filtered or unexported fields
}
func (CubicSegment) ArcLength ¶
func (s CubicSegment) ArcLength() float64
func (CubicSegment) ArcTime ¶
func (s CubicSegment) ArcTime(len float64) float64
func (CubicSegment) Dir ¶
func (s CubicSegment) Dir(t float64) Point
func (CubicSegment) End ¶
func (s CubicSegment) End() Point
func (CubicSegment) Point ¶
func (s CubicSegment) Point(t float64) Point
func (CubicSegment) Start ¶
func (s CubicSegment) Start() Point
type LinearSegment ¶
type LinearSegment struct {
P0, P1 Point
}
func (LinearSegment) ArcLength ¶
func (s LinearSegment) ArcLength() float64
func (LinearSegment) ArcTime ¶
func (s LinearSegment) ArcTime(len float64) float64
func (LinearSegment) Dir ¶
func (s LinearSegment) Dir(t float64) Point
func (LinearSegment) End ¶
func (s LinearSegment) End() Point
func (LinearSegment) Point ¶
func (s LinearSegment) Point(t float64) Point
func (LinearSegment) Start ¶
func (s LinearSegment) Start() Point
type Matrix ¶
Der Datentyp Matrix enthält die relevanten Felder einer Transformations- Matrix für linear-affine Abbildungen in der Ebene. Mij ist das Element auf der Zeile i, in der Spalte j. Die letzte Zeile der Matrix ist immer [0, 0, 1] und wird daher nicht mitgeführt.
func Rotate ¶
Erzeugt eine Rotationsmatrix um den Winkel a (im Bogenmass). Drehpunkt ist der Ursprung des Koordinatensystems, Drehrichtung ist im Gegenuhrzeigersinn.
func RotateAbout ¶
Erzeugt eine Rotationsmatrix um den Winkel a (im Bogenmass) mit Drehpunkt bei rp.
func Scale ¶
Erzeugt eine Skalierungsmatrix mit den Skalierungsfaktoren sx in X-Richtung und sy in Y-Richtung. Zentrum der Skalierung ist der Ursprung des Koordinatensystems.
func ScaleAbout ¶
Erzeugt eine Skalierungsmatrix mit den Skalierungsfaktoren sx in X-Richtung und sy in Y-Richtung. Zentrum der Skalierung ist der Punkt sp.
func Translate ¶
Erzeugt eine Translationsmatrix. Die Angaben für die Translation befinden sich als X-, resp. Y-Koordinate im Punkt d .
func (Matrix) AsAff3 ¶
Im Package golang.org/x/image/math/f64 sind affine Transformationen als Arrays von Float-Werten definiert. Für die Konvertierung in diesen Typ steht die folgende Methode zur Verfügung.
func (Matrix) Inv ¶
Invertiert die Matrix a und liefert das Resultat als neue Matrix. Da wir es hier eigentlich nie singulären Matrizen zu tun haben (ausser jemand erstellt bewusst die Nullmatrix oder eine Skalierungsmatrix mit 0 als einem der beiden Faktoren) verzichten wir hier zugunsten der Performance auf einen entsprechenden Test.
func (Matrix) Multiply ¶
Multipliziert die Matrizen a und b (d.h. berechnet a*b) und liefert das Resultat als neue Matrix.
func (Matrix) ScaleAbout ¶
Siehe Translate
func (Matrix) String ¶
Mit dieser Methode implementiert Matrix schliesslich das 'Stringer' Interface und kann bequem per Printf("%v", m) ausgegeben werden. Beachte, dass dieser String Zeilenumbrüche enthält!
func (Matrix) Transform ¶
Hier schliesslich spielt die Musik: eine Matrix wird für die Transformation eines Punktes verwendet. Es wird ein neuer Punkt erstellt, aktuell gibt noch keinen Bedarf nach 'in place' Transformation.
func (Matrix) TransformPoint ¶
TransformPoint und TransformVector sind zwei Methoden, die aus dem gg-Package übernommen wurden: sie operieren auf Punkte, resp. Vektoren, die als Paar von Float-Werten angegeben werden.
func (Matrix) TransformRect ¶
Will man den zweiten geometrischen Typ (Rectangle) transformieren, dann ist dies die Methode der Wahl.
func (Matrix) TransformVector ¶
Während TransformPoint eine vollständige Transformation durchführt, wird bei TransformVector die Translation ignoriert.
type Point ¶
type Point struct {
X, Y float64
}
Der Datentyp Point ist für Koordinaten in einem Koordinatensystem mit Fliesskommawerten gedacht. Dass der Typ Point und nicht Coord oder Vector heisst, hat eher historische Gründe.
func NewPointIMG ¶
Erstellt einen neuen Punkt aus den Koordianten des angegebenen Punktes aus dem image-Paket.
func (Point) AsCoord ¶
Liefert die X- und Y-Koordinate als einzelne Werte zurück. Gut zu verwenden in Funktionen, welche die Koordinaten als separate Werte erwarten.
func (Point) Dist2 ¶
Berechnet den quadrierten Abstand zwischen den Punkten p und q. Siehe auch den kommentar bei Distance.
func (Point) Distance ¶
Berechnet den euklidischen Abstand zwischen den Punkten p und q. Will man nur Abstände vergleichen, ist es oft effizienter, die Methode Dist2 zu verwenden, welche den quadrierten Abstand ermittelt (also ohne Quadratwurzel) und damit schneller ist.
func (Point) Div ¶
Dividiert die Koordinaten des Punktes p durch den Wert k. Eliminiert, kann durch Mul abgedeckt werden!
func (Point) Eq ¶
Prüft, ob p und q exakt die gleichen Koordinaten haben. Ev. sollte hier auch ein Zahlenvergleich mit eps gemacht werden.
func (Point) Interpolate ¶
Berechnet einen neuen Punkt, der linear zwischen p und q liegt. Es gilt:
- t=0.0: das Resultat ist p
- t=1.0: das Resultat ist q
t kann auch ausserhalb des Intervalls [0,1] liegen. In diesem Fall erhalten wir Punkte, welche nicht auf der Strecke zwischen p und q liegen aber auf der Geraden durch p und q.
func (Point) Max ¶
Vergleicht die X- sowie die Y-Werte der Punkte p und q und retourniert einen neuen Punkt mit den jeweils grösseren Werten.
func (Point) Min ¶
Vergleicht die X- sowie die Y-Werte der Punkte p und q und retourniert einen neuen Punkt mit den jeweils kleineren Werten.
func (*Point) Move ¶
Move verschiebt einen Punkt um die X- und Y-Werte des Punktes dp. Diese Verschiebung wirkt sich auf das Objekt selber aus!
func (*Point) Set ¶
Damit können Punkte (resp. die Koordinaten dazu) auch über ein Textfile oder die Kommandozeile eingelesen werden. Mit String zusammen implementiert Point somit das Getter-Interface aus flag.
func (Point) String ¶
Gibt die Koordinaten des Punktes in der Form '(x; y)' zurück. Implementiert das Stringer-Interface.
type QuadraSegment ¶
type QuadraSegment struct {
P0, C0, P1 Point
// contains filtered or unexported fields
}
type Rectangle ¶
type Rectangle struct {
Min, Max Point
}
Datentype für Rechtecke in einem 2-dimensionalen Feld. Gespeichert werden die zwei Eckpunkte: Min für den Punkt links oben (d.h. mit den kleineren Werten für die x-, resp. y-Koordinate) und Max für den gegenüberliegenen Punkt. Die Felder Min und Max sind exportiert. Ein veränderndes Programm muss darauf achten, dass die Bedingung (Min.X <= Max.X UND Min.Y <= Max.Y) eingehalten wird!
func NewRectangle ¶
Neues Rechteck mit den einzelnen Koordinaten für die Eckpunkte mit den kleinsten (Min) und grössten Werten (Max).
func NewRectangleCWH ¶
Neues Rechteck mit den Koordinaten des Mittelpunktes, der Breite und der Höhe.
func NewRectangleIMG ¶
Erstellt ein neues Rechteck aus dem Datentyp Rectangle des image-Paketes.
func NewRectangleWH ¶
Neues Rechteck mit den Koordinaten des Eckpunktes mit den kleinsten Werten, der Breite (d.h. Ausdehung in x-Richtung) und der Höhe (Ausdehung in y-Richtung).
func (Rectangle) AsCoord ¶
Liefert X- und Y-Koordinaten des Eckpunktes mit den kleinsten Koordinaten sowie die Breite und Höhe als eigenständige Werte.
func (Rectangle) Canon ¶
Kanonisiert das Rechteck r. Das heisst, dass im resultierenden Rechteck die Koordinaten des Punktes Min auf jeden Fall kleiner sind als die Koord. des Punktes Max.
func (Rectangle) Empty ¶
Prüft, ob das Rechteck leer ist. Im Fall, dass Min > Max ist, gilt das Rechteck als leer.
func (Rectangle) Eq ¶
Prüft, ob zwei Rechteck gleich sind, dh. die exakt gleichen Koordinaten haben.
func (Rectangle) Inset ¶
Verschiebt die Ränder von r um d nach Innen und retourniert dieses neü Rechteck. d kann negativ sein, in diesem Fall wird das Rechteck vergrössert
func (Rectangle) Int ¶
Konvertiert das Rechteck in den Datentyp image.Rectangle aus der Standard- Library von Go.
func (Rectangle) Intersect ¶
Berechnet ein neues Rechteck, welches der Schnitt der Rechtecke r und s ist. Das Resultat kann leer sein, falls sich r und s nicht überlappen.
func (*Rectangle) Move ¶
Verschiebt das Rechteck r um die Koordinaten aus dem Punkt dp. Die Verschiebung wirkt sich direkt das Objekt aus.
func (Rectangle) PosRel ¶
Liefert die relativen Positionsdaten des Punktes p gegenüber dem Rechteck r Also falls p=r.Min, dann wird (0.0, 0.0) retourniert; falls p=r.Max, wird (1.0, 1.0) retourniert, etc.
func (Rectangle) RelPos ¶
Erstellt einen Punkt, dessen Koordianten relativ zum Rechteck r über die Grössen fx und fx bestimmt werden. Falls bspw. fx=1.0 und fy=0.0 sind, wird (r.Max.X, r.Min.Y) retourniert.
func (Rectangle) SetInside ¶
Retourniert ausgehend vom Punkt p einen neuen Punkt, der sich garantiert im Rechteck r befindet.