...
1
2
3
4
5 package plotter
6
7 import (
8 "gonum.org/v1/plot"
9 "gonum.org/v1/plot/vg"
10 "gonum.org/v1/plot/vg/draw"
11 )
12
13
14
15 type Function struct {
16 F func(x float64) (y float64)
17
18
19
20 XMin, XMax float64
21
22 Samples int
23
24 draw.LineStyle
25 }
26
27
28
29 func NewFunction(f func(float64) float64) *Function {
30 return &Function{
31 F: f,
32 Samples: 50,
33 LineStyle: DefaultLineStyle,
34 }
35 }
36
37
38
39 func (f *Function) Plot(c draw.Canvas, p *plot.Plot) {
40 trX, trY := p.Transforms(&c)
41
42 min, max := f.XMin, f.XMax
43 if min == 0 && max == 0 {
44 min = p.X.Min
45 max = p.X.Max
46 }
47 d := (max - min) / float64(f.Samples-1)
48 line := make([]vg.Point, f.Samples)
49 for i := range line {
50 x := min + float64(i)*d
51 line[i].X = trX(x)
52 line[i].Y = trY(f.F(x))
53 }
54 c.StrokeLines(f.LineStyle, c.ClipLinesXY(line)...)
55 }
56
57
58
59
60 func (f Function) Thumbnail(c *draw.Canvas) {
61 y := c.Center().Y
62 c.StrokeLine2(f.LineStyle, c.Min.X, y, c.Max.X, y)
63 }
64
View as plain text