...
1
2
3
4
5 package plotter_test
6
7 import (
8 "image/color"
9 "image/png"
10 "log"
11 "math"
12 "os"
13
14 "gonum.org/v1/plot"
15 "gonum.org/v1/plot/palette/moreland"
16 "gonum.org/v1/plot/plotter"
17 "gonum.org/v1/plot/vg"
18 "gonum.org/v1/plot/vg/draw"
19 "gonum.org/v1/plot/vg/vgimg"
20 )
21
22 func ExampleField() {
23 f := plotter.NewField(field{
24 r: 17, c: 19,
25 fn: func(x, y float64) plotter.XY {
26 return plotter.XY{
27 X: y,
28 Y: -x,
29 }
30 },
31 })
32 f.LineStyle.Width = 0.2
33
34 p := plot.New()
35 p.Title.Text = "Vector field"
36 p.X.Tick.Marker = integerTicks{}
37 p.Y.Tick.Marker = integerTicks{}
38
39 p.Add(f)
40
41 img := vgimg.New(250, 175)
42 dc := draw.New(img)
43
44 p.Draw(dc)
45 w, err := os.Create("testdata/field.png")
46 if err != nil {
47 log.Panic(err)
48 }
49 png := vgimg.PngCanvas{Canvas: img}
50 if _, err = png.WriteTo(w); err != nil {
51 log.Panic(err)
52 }
53 }
54
55 func ExampleField_colors() {
56 f := plotter.NewField(field{
57 r: 5, c: 9,
58 fn: func(x, y float64) plotter.XY {
59 return plotter.XY{
60 X: -0.75*x + y,
61 Y: -0.75*y - x,
62 }
63 },
64 })
65
66 pal := moreland.ExtendedBlackBody()
67 pal.SetMin(0)
68 pal.SetMax(1.1)
69
70
71
72 f.DrawGlyph = func(c vg.Canvas, sty draw.LineStyle, v plotter.XY) {
73 c.Push()
74 defer c.Pop()
75 mag := math.Hypot(v.X, v.Y)
76 var pa vg.Path
77 if mag == 0 {
78
79 c.SetColor(color.Black)
80 pa.Move(vg.Point{X: sty.Width})
81 pa.Arc(vg.Point{}, sty.Width, 0, 2*math.Pi)
82 pa.Close()
83 c.Fill(pa)
84 return
85 }
86
87 col, err := pal.At(mag)
88 if err != nil {
89 panic(err)
90 }
91 c.SetColor(col)
92 pa.Move(vg.Point{})
93 pa.Line(vg.Point{X: 1, Y: 0})
94 pa.Close()
95 c.Stroke(pa)
96 }
97
98 p := plot.New()
99 p.Title.Text = "Vortex"
100 p.X.Tick.Marker = integerTicks{}
101 p.Y.Tick.Marker = integerTicks{}
102
103 p.Add(f)
104
105 img := vgimg.New(250, 175)
106 dc := draw.New(img)
107
108 p.Draw(dc)
109 w, err := os.Create("testdata/color_field.png")
110 if err != nil {
111 log.Panic(err)
112 }
113 defer w.Close()
114 png := vgimg.PngCanvas{Canvas: img}
115 if _, err = png.WriteTo(w); err != nil {
116 log.Panic(err)
117 }
118 }
119
120 func ExampleField_gophers() {
121 file, err := os.Open("testdata/gopher_running.png")
122 if err != nil {
123 log.Panic(err)
124 }
125 defer file.Close()
126 gopher, err := png.Decode(file)
127 if err != nil {
128 log.Panic(err)
129 }
130
131 f := plotter.NewField(field{
132 r: 5, c: 9,
133 fn: func(x, y float64) plotter.XY {
134 return plotter.XY{
135 X: -0.75*x + y,
136 Y: -0.75*y - x,
137 }
138 },
139 })
140
141
142
143 f.DrawGlyph = func(c vg.Canvas, _ draw.LineStyle, v plotter.XY) {
144
145
146 if math.Hypot(v.X, v.Y) == 0 {
147 return
148 }
149
150
151
152 c.Translate(vg.Point{X: -1, Y: -1})
153 c.DrawImage(vg.Rectangle{Max: vg.Point{X: 2, Y: 2}}, gopher)
154 }
155
156 p := plot.New()
157 p.Title.Text = "Gopher vortex"
158 p.X.Tick.Marker = integerTicks{}
159 p.Y.Tick.Marker = integerTicks{}
160
161 p.Add(f)
162
163 img := vgimg.New(250, 175)
164 dc := draw.New(img)
165
166 p.Draw(dc)
167 w, err := os.Create("testdata/gopher_field.png")
168 if err != nil {
169 log.Panic(err)
170 }
171 png := vgimg.PngCanvas{Canvas: img}
172 if _, err = png.WriteTo(w); err != nil {
173 log.Panic(err)
174 }
175 }
176
View as plain text