// DrawGlyph implements the GlyphDrawer interface. func (c CircleGlyph) DrawGlyph(da *DrawArea, sty GlyphStyle, pt Point) { var p vg.Path p.Move(pt.X+sty.Radius, pt.Y) p.Arc(pt.X, pt.Y, sty.Radius, 0, 2*math.Pi) p.Close() da.Fill(p) }
func (pt *Dots) Plot(da plot.DrawArea, plt *plot.Plot) { trX, trY := plt.Transforms(&da) da.SetColor(pt.Color) for i := range pt.Y { // Transform the data x, y coordinate of this bubble // to the corresponding drawing coordinate. x := trX(pt.X[i]) y := trY(pt.Y[i]) // Get the radius of this bubble. The radius // is specified in drawing units (i.e., its size // is given as the final size at which it will // be drawn) so it does not need to be transformed. rad := vg.Length(2) // Fill a circle centered at x,y on the draw area. var p vg.Path p.Move(x+rad, y) p.Arc(x, y, rad, 0, 2*math.Pi) p.Close() da.Fill(p) } }
// DrawGlyph implements the Glyph interface. func (RingGlyph) DrawGlyph(da *DrawArea, sty GlyphStyle, pt Point) { da.SetLineStyle(LineStyle{Color: sty.Color, Width: vg.Points(0.5)}) var p vg.Path p.Move(pt.X+sty.Radius, pt.Y) p.Arc(pt.X, pt.Y, sty.Radius, 0, 2*math.Pi) p.Close() da.Stroke(p) }
// DrawGlyph implements the Glyph interface. func (PyramidGlyph) DrawGlyph(da *DrawArea, sty GlyphStyle, pt Point) { r := sty.Radius + (sty.Radius-sty.Radius*sinπover6)/2 var p vg.Path p.Move(pt.X, pt.Y+r) p.Line(pt.X-r*cosπover6, pt.Y-r*sinπover6) p.Line(pt.X+r*cosπover6, pt.Y-r*sinπover6) p.Close() da.Fill(p) }
func pathRectangle(top vg.Length, right vg.Length, bottom vg.Length, left vg.Length) vg.Path { p := vg.Path{} p.Move(left, top) p.Line(right, top) p.Line(right, bottom) p.Line(left, bottom) p.Close() return p }
// DrawGlyph implements the Glyph interface. func (TriangleGlyph) DrawGlyph(da *DrawArea, sty GlyphStyle, pt Point) { da.SetLineStyle(LineStyle{Color: sty.Color, Width: vg.Points(0.5)}) r := sty.Radius + (sty.Radius-sty.Radius*sinπover6)/2 var p vg.Path p.Move(pt.X, pt.Y+r) p.Line(pt.X-r*cosπover6, pt.Y-r*sinπover6) p.Line(pt.X+r*cosπover6, pt.Y-r*sinπover6) p.Close() da.Stroke(p) }
// DrawGlyph implements the Glyph interface. func (BoxGlyph) DrawGlyph(da *DrawArea, sty GlyphStyle, pt Point) { x := (sty.Radius-sty.Radius*cosπover4)/2 + sty.Radius*cosπover4 var p vg.Path p.Move(pt.X-x, pt.Y-x) p.Line(pt.X+x, pt.Y-x) p.Line(pt.X+x, pt.Y+x) p.Line(pt.X-x, pt.Y+x) p.Close() da.Fill(p) }
// DrawGlyph implements the Glyph interface. func (SquareGlyph) DrawGlyph(da *DrawArea, sty GlyphStyle, pt Point) { da.SetLineStyle(LineStyle{Color: sty.Color, Width: vg.Points(0.5)}) x := (sty.Radius-sty.Radius*cosπover4)/2 + sty.Radius*cosπover4 var p vg.Path p.Move(pt.X-x, pt.Y-x) p.Line(pt.X+x, pt.Y-x) p.Line(pt.X+x, pt.Y+x) p.Line(pt.X-x, pt.Y+x) p.Close() da.Stroke(p) }
// FillPolygon fills a polygon with the given color. func (da *DrawArea) FillPolygon(clr color.Color, pts []Point) { if len(pts) == 0 { return } da.SetColor(clr) var p vg.Path p.Move(pts[0].X, pts[0].Y) for _, pt := range pts[1:] { p.Line(pt.X, pt.Y) } p.Close() da.Fill(p) }
// Plot implements the Plot method of the plot.Plotter interface. func (bs *Bubbles) Plot(da plot.DrawArea, plt *plot.Plot) { trX, trY := plt.Transforms(&da) da.SetColor(bs.Color) for _, d := range bs.XYZs { x := trX(d.X) y := trY(d.Y) if !da.Contains(plot.Point{x, y}) { continue } rad := bs.radius(d.Z) // draw a circle centered at x, y var p vg.Path p.Move(x+rad, y) p.Arc(x, y, rad, 0, 2*math.Pi) p.Close() da.Fill(p) } }
// DrawFonts draws some text in all of the various // fonts along with a box to make sure that their // sizes are computed correctly. func DrawFonts(c vg.Canvas) { y := vg.Points(0) var fonts []string for fname := range vg.FontMap { fonts = append(fonts, fname) } sort.Strings(fonts) for _, fname := range fonts { font, err := vg.MakeFont(fname, 20) if err != nil { panic(err) } w := font.Width(fname + "Xqg") h := font.Extents().Ascent c.FillString(font, 0, y-font.Extents().Descent, fname+"Xqg") fmt.Println(fname) var path vg.Path path.Move(0, y+h) path.Line(w, y+h) path.Line(w, y) path.Line(0, y) path.Close() c.Stroke(path) path = vg.Path{} c.SetColor(color.RGBA{B: 255, A: 255}) c.SetLineDash([]vg.Length{vg.Points(5), vg.Points(3)}, 0) path.Move(0, y-font.Extents().Descent) path.Line(w, y-font.Extents().Descent) c.Stroke(path) c.SetColor(color.Black) c.SetLineDash([]vg.Length{}, 0) y += h } }
// Plot draws the Line, implementing the plot.Plotter // interface. func (pts *Line) Plot(da plot.DrawArea, plt *plot.Plot) { trX, trY := plt.Transforms(&da) ps := make([]plot.Point, len(pts.XYs)) for i, p := range pts.XYs { ps[i].X = trX(p.X) ps[i].Y = trY(p.Y) } if pts.ShadeColor != nil && len(ps) > 0 { da.SetColor(*pts.ShadeColor) minY := trY(plt.Y.Min) var pa vg.Path pa.Move(ps[0].X, minY) for i := range pts.XYs { pa.Line(ps[i].X, ps[i].Y) } pa.Line(ps[len(pts.XYs)-1].X, minY) pa.Close() da.Fill(pa) } da.StrokeLines(pts.LineStyle, da.ClipLinesXY(ps)...) }