Documentation
¶
Overview ¶
Package vg defines an interface for drawing 2D vector graphics. This package is designed with the hope that many different vector graphics back-ends can conform to the interface.
Example (AddFont) ¶
package main
import (
"archive/tar"
"bytes"
"compress/gzip"
"fmt"
"io"
"log"
"net/http"
"golang.org/x/image/font/opentype"
"github.com/gopherd/plot"
"github.com/gopherd/plot/font"
"github.com/gopherd/plot/plotter"
"github.com/gopherd/plot/vg"
)
func main() {
// download font from debian
const url = "http://http.debian.net/debian/pool/main/f/fonts-ipafont/fonts-ipafont_00303.orig.tar.gz"
resp, err := http.Get(url)
if err != nil {
log.Fatalf("could not download IPA font file: %+v", err)
}
defer resp.Body.Close()
ttf, err := untargz("IPAfont00303/ipam.ttf", resp.Body)
if err != nil {
log.Fatalf("could not untar archive: %+v", err)
}
fontTTF, err := opentype.Parse(ttf)
if err != nil {
log.Fatal(err)
}
mincho := font.Font{Typeface: "Mincho"}
font.DefaultCache.Add([]font.Face{
{
Font: mincho,
Face: fontTTF,
},
})
if !font.DefaultCache.Has(mincho) {
log.Fatalf("no font %q!", mincho.Typeface)
}
plot.DefaultFont = mincho
plotter.DefaultFont = mincho
p := plot.New()
p.Title.Text = "Hello, 世界!"
p.X.Label.Text = "世"
p.Y.Label.Text = "界"
labels, err := plotter.NewLabels(
plotter.XYLabels{
XYs: make(plotter.XYs, 1),
Labels: []string{"こんにちは世界"},
},
)
if err != nil {
log.Fatalf("could not create labels: %+v", err)
}
p.Add(labels)
p.Add(plotter.NewGrid())
err = p.Save(10*vg.Centimeter, 10*vg.Centimeter, "mincho-font.png")
if err != nil {
log.Fatalf("could not save plot: %+v", err)
}
}
func untargz(name string, r io.Reader) ([]byte, error) {
gr, err := gzip.NewReader(r)
if err != nil {
return nil, fmt.Errorf("could not create gzip reader: %v", err)
}
defer gr.Close()
tr := tar.NewReader(gr)
for {
hdr, err := tr.Next()
if err != nil {
if err == io.EOF {
return nil, fmt.Errorf("could not find %q in tar archive", name)
}
return nil, fmt.Errorf("could not extract header from tar archive: %v", err)
}
if hdr == nil || hdr.Name != name {
continue
}
buf := new(bytes.Buffer)
_, err = io.Copy(buf, tr)
if err != nil {
return nil, fmt.Errorf("could not extract %q file from tar archive: %v", name, err)
}
return buf.Bytes(), nil
}
}
Example (InMemoryCanvas) ¶
package main
import (
"image/color"
"image/png"
"log"
"math"
"os"
"github.com/gopherd/plot"
"github.com/gopherd/plot/plotter"
"github.com/gopherd/plot/vg"
"github.com/gopherd/plot/vg/draw"
"github.com/gopherd/plot/vg/vgimg"
)
func main() {
p := plot.New()
p.Title.Text = "sin(x)"
p.X.Label.Text = "x"
p.Y.Label.Text = "f(x)"
p.X.Min = -2 * math.Pi
p.X.Max = +2 * math.Pi
fct := plotter.NewFunction(func(x float64) float64 {
return math.Sin(x)
})
fct.Color = color.RGBA{R: 255, A: 255}
p.Add(fct, plotter.NewGrid())
c := vgimg.New(10*vg.Centimeter, 5*vg.Centimeter)
p.Draw(draw.New(c))
// Save image.
f, err := os.Create("testdata/sine.png")
if err != nil {
log.Fatalf("could not create output image file: %+v", err)
}
defer f.Close()
err = png.Encode(f, c.Image())
if err != nil {
log.Fatalf("could not encode image to PNG: %+v", err)
}
err = f.Close()
if err != nil {
log.Fatalf("could not close output image file: %+v", err)
}
}
Example (WriterToCanvas) ¶
package main
import (
"image/color"
"log"
"math"
"os"
"github.com/gopherd/plot"
"github.com/gopherd/plot/plotter"
"github.com/gopherd/plot/vg"
"github.com/gopherd/plot/vg/draw"
"github.com/gopherd/plot/vg/vgimg"
)
func main() {
p := plot.New()
p.Title.Text = "cos(x)"
p.X.Label.Text = "x"
p.Y.Label.Text = "f(x)"
p.X.Min = -2 * math.Pi
p.X.Max = +2 * math.Pi
fct := plotter.NewFunction(func(x float64) float64 {
return math.Cos(x)
})
fct.Color = color.RGBA{B: 255, A: 255}
p.Add(fct, plotter.NewGrid())
c := vgimg.PngCanvas{
Canvas: vgimg.New(10*vg.Centimeter, 5*vg.Centimeter),
}
p.Draw(draw.New(c))
// Save image.
f, err := os.Create("testdata/cosine.png")
if err != nil {
log.Fatalf("could not create output image file: %+v", err)
}
defer f.Close()
_, err = c.WriteTo(f)
if err != nil {
log.Fatalf("could not encode image to PNG: %+v", err)
}
err = f.Close()
if err != nil {
log.Fatalf("could not close output image file: %+v", err)
}
}
Index ¶
Examples ¶
Constants ¶
const ( Inch = font.Inch Centimeter = font.Centimeter Millimeter = font.Millimeter )
Common lengths.
const ( MoveComp = iota LineComp ArcComp CurveComp CloseComp )
Constants that tag the type of each path component.
Variables ¶
This section is empty.
Functions ¶
func Initialize ¶
func Initialize(c Canvas)
Initialize sets all of the canvas's values to their initial values.
Types ¶
type Canvas ¶
type Canvas interface {
// SetLineWidth sets the width of stroked paths.
// If the width is not positive then stroked lines
// are not drawn.
//
// The initial line width is 1 point.
SetLineWidth(Length)
// SetLineDash sets the dash pattern for lines.
// The pattern slice specifies the lengths of
// alternating dashes and gaps, and the offset
// specifies the distance into the dash pattern
// to start the dash.
//
// The initial dash pattern is a solid line.
SetLineDash(pattern []Length, offset Length)
// SetColor sets the current drawing color.
// Note that fill color and stroke color are
// the same, so if you want different fill
// and stroke colors then you must set a color,
// draw fills, set a new color and then draw lines.
//
// The initial color is black.
// If SetColor is called with a nil color then black is used.
SetColor(color.Color)
// Rotate applies a rotation transform to the context.
// The parameter is specified in radians.
Rotate(rad float64)
// Translate applies a translational transform
// to the context.
Translate(pt Point)
// Scale applies a scaling transform to the
// context.
Scale(x, y float64)
// Push saves the current line width, the
// current dash pattern, the current
// transforms, and the current color
// onto a stack so that the state can later
// be restored by calling Pop().
Push()
// Pop restores the context saved by the
// corresponding call to Push().
Pop()
// Stroke strokes the given path.
Stroke(Path)
// Fill fills the given path.
Fill(Path)
// FillString fills in text at the specified
// location using the given font.
// If the font size is zero, the text is not drawn.
FillString(f font.Face, pt Point, text string)
// DrawImage draws the image, scaled to fit
// the destination rectangle.
DrawImage(rect Rectangle, img image.Image)
}
A Canvas is the main drawing interface for 2D vector graphics. The origin is in the bottom left corner.
func MultiCanvas ¶
MultiCanvas creates a canvas that duplicates its drawing operations to all the provided canvases, similar to the Unix tee(1) command.
Each drawing operation is sent to each listed canvas, one at a time.
type CanvasSizer ¶
CanvasSizer is a Canvas with a defined size.
type CanvasWriterTo ¶
type CanvasWriterTo interface {
CanvasSizer
io.WriterTo
}
CanvasWriterTo is a CanvasSizer with a WriteTo method.
type Length ¶
A Length is a unit-independent representation of length. Internally, the length is stored in postscript points.
func ParseLength ¶
ParseLength parses a Length string. A Length string is a possible signed floating number with a unit. e.g. "42cm" "2.4in" "66pt" If no unit was given, ParseLength assumes it was (postscript) points. Currently valid units are:
mm (millimeter) cm (centimeter) in (inch) pt (point)
type Path ¶
type Path []PathComp
func (*Path) Arc ¶
Arc adds an arc to the path defined by the center point of the arc's circle, the radius of the circle and the start and sweep angles.
func (*Path) Close ¶
func (p *Path) Close()
Close closes the path by connecting the current location to the start location with a line.
func (*Path) CubeTo ¶
CubeTo adds a cubic curve element to the path, given by the control points p1 and p2 and the end point pt.
type PathComp ¶
type PathComp struct {
// Type is the type of a particluar component.
// Based on the type, each of the following
// fields may have a different meaning or may
// be meaningless.
Type int
// The Pos field is used as the destination
// of a MoveComp or LineComp and is the center
// point of an ArcComp. It is not used in
// the CloseComp.
Pos Point
// Control is one or two intermediate points
// for a CurveComp used by QuadTo and CubeTo.
Control []Point
// Radius is only used for ArcComps, it is
// the radius of the circle defining the arc.
Radius Length
// Start and Angle are only used for ArcComps.
// They define the start angle and sweep angle of
// the arc around the circle. The units of the
// angle are radians.
Start, Angle float64
}
A PathComp is a component of a path structure.
type Point ¶
type Point struct {
X, Y Length
}
A Point is a location in 2d space.
Points are used for drawing, not for data. For data, see the XYer interface.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package draw provides types and functions to draw shapes on a vg.Canvas.
|
Package draw provides types and functions to draw shapes on a vg.Canvas. |
|
Package recorder provides support for vector graphics serialization.
|
Package recorder provides support for vector graphics serialization. |
|
Package vgeps implements the vg.Canvas interface using encapsulated postscript.
|
Package vgeps implements the vg.Canvas interface using encapsulated postscript. |
|
Package vgimg implements the vg.Canvas interface using git.sr.ht/~sbinet/gg as a backend to output raster images.
|
Package vgimg implements the vg.Canvas interface using git.sr.ht/~sbinet/gg as a backend to output raster images. |