如题,关键不是图怎么样,而是说,go可以拿来实现动态图验证码,加上go支持cgi、fcgi,完全可以做个exe拿去增补现有的服务器么。
ball.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
package main import ( "github.com/hydra13142/cube" "github.com/hydra13142/geom" "github.com/hydra13142/paint" "image" "image/color/palette" "image/gif" "math" "os" ) var ( pln *cube.Plain unx cube.Vector uny cube.Vector ) const ( H = 18 W = 36 ) func init() { pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{ 4 , 4 , 3 }) uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{ 0 , 0 , 10 })).Unit() unx = cube.OuterProduct(uny, cube.Vector{ 4 , 4 , 3 }).Unit() } func main() { var x [H + 1 ][W]cube.Point var y [H + 1 ][W]geom.Point dz := math.Pi / H dxy := math.Pi * 2 / W for i := 0 ; i <= H; i++ { az := float64(i)*dz - math.Pi/ 2 r := 140 * math.Cos(az) z := 140 * math.Sin(az) for j := 0 ; j < W; j++ { axy := float64(j) * dxy x[i][j] = cube.Point{math.Cos(axy) * r, math.Sin(axy) * r, z} } } pics := make([]*image.Paletted, 0 , 20 ) img := paint.Image{ FR: paint.Green, BG: paint.White, } stp := dxy / 20 delay := make([] int , 0 , 20 ) for t := 0 ; t < 20 ; t++ { img.Image = image.NewPaletted(image.Rect( 0 , 0 , 300 , 300 ), palette.Plan9) for i := 0 ; i <= H; i++ { for j := 0 ; j < W; j++ { ox := cube.FromTo(cube.Point{}, x[i][j]) y[i][j] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)} a, b := x[i][j].X, x[i][j].Y x[i][j].X = a*math.Cos(stp) - b*math.Sin(stp) x[i][j].Y = b*math.Cos(stp) + a*math.Sin(stp) } } for i := 0 ; i < H; i++ { for j := 0 ; j < W; j++ { img.Line( 150 + int (y[i][j].X), 150 - int (y[i][j].Y), 150 + int (y[i][(j+ 1 )%W].X), 150 - int (y[i][(j+ 1 )%W].Y), ) img.Line( 150 + int (y[i][j].X), 150 - int (y[i][j].Y), 150 + int (y[i+ 1 ][j].X), 150 - int (y[i+ 1 ][j].Y), ) } } pics = append(pics, img.Image.(*image.Paletted)) delay = append(delay, 5 ) } file, _ := os.Create( "ball.gif" ) defer file.Close() gif.EncodeAll(file, &gif.GIF{ Image: pics, Delay: delay, LoopCount: 5 * len(delay), }) } |
woniu.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
package main import ( "github.com/hydra13142/cube" "github.com/hydra13142/geom" "github.com/hydra13142/paint" "image" "image/color/palette" "image/gif" "math" "os" ) var ( pln *cube.Plain unx, uny cube.Vector ) const ( H = 18 W = 96 ) func init() { pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{ 2 , 2 , 1 }) uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{ 0 , 0 , 10 })).Unit() unx = cube.OuterProduct(uny, cube.Vector{ 2 , 2 , 1 }).Unit() } func main() { var x [H + 1 ][W]cube.Point var y [H + 1 ][W]geom.Point dz := math.Pi / H dxy := math.Pi * 4 / W for i := 0 ; i <= H; i++ { az := float64(i)*dz - math.Pi/ 2 r := 300 * math.Cos(az) z := 100 * math.Sin(az) for j := 0 ; j < W; j++ { axy := float64(j) * dxy R := float64(j) * r / W x[i][j] = cube.Point{math.Cos(axy) * R, math.Sin(axy) * R, z} } } pics := make([]*image.Paletted, 0 , 20 ) img := paint.Image{ FR: paint.Green, BG: paint.White, } stp := math.Pi / W delay := make([] int , 0 , 2 *W) for t := 0 ; t < 2 *W; t++ { img.Image = image.NewPaletted(image.Rect( 0 , 0 , 600 , 300 ), palette.Plan9) for i := 0 ; i <= H; i++ { for j := 0 ; j < W; j++ { ox := cube.FromTo(cube.Point{}, x[i][j]) y[i][j] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)} a, b := x[i][j].X, x[i][j].Y x[i][j].X = a*math.Cos(stp) - b*math.Sin(stp) x[i][j].Y = b*math.Cos(stp) + a*math.Sin(stp) } } img.Line( 300 + int (y[ 0 ][ 0 ].X), 150 - int (y[ 0 ][ 0 ].Y), 300 + int (y[H][ 0 ].X), 150 - int (y[H][ 0 ].Y), ) for i := 0 ; i < H; i++ { for j := 1 ; j < W; j++ { img.Line( 300 + int (y[i][j].X), 150 - int (y[i][j].Y), 300 + int (y[i][j- 1 ].X), 150 - int (y[i][j- 1 ].Y), ) img.Line( 300 + int (y[i][j].X), 150 - int (y[i][j].Y), 300 + int (y[i+ 1 ][j].X), 150 - int (y[i+ 1 ][j].Y), ) } } pics = append(pics, img.Image.(*image.Paletted)) delay = append(delay, 5 ) } file, _ := os.Create( "woniu.gif" ) defer file.Close() gif.EncodeAll(file, &gif.GIF{ Image: pics, Delay: delay, LoopCount: 5 * len(delay), }) } |
rotate.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package main import ( "github.com/hydra13142/cube" "github.com/hydra13142/geom" "github.com/hydra13142/paint" "image" "image/color/palette" "image/gif" "math" "os" ) var ( pln *cube.Plain unx, uny cube.Vector ) const ( H = 9 W = 36 ) func init() { pln, _ = cube.NewPlain(cube.Point{}, cube.Vector{ 4 , 4 , 3 }) uny = cube.FromTo(cube.Point{}, pln.VerticalPoint(cube.Point{ 0 , 0 , 10 })).Unit() unx = cube.OuterProduct(uny, cube.Vector{ 4 , 4 , 3 }).Unit() } func main() { var x [H*W + 1 ]cube.Point var y [H*W + 1 ]geom.Point dxy := (math.Pi * 2 ) / W dz := math.Pi / H for i := 0 ; i <= H*W; i++ { az := float64(i)*dz/W - math.Pi/ 2 r := 140 * math.Cos(az) z := 140 * math.Sin(az) axy := float64(i) * dxy x[i] = cube.Point{math.Cos(axy) * r, math.Sin(axy) * r, z} } pics := make([]*image.Paletted, 0 , 20 ) img := paint.Image{ FR: paint.Green, BG: paint.White, } stp := math.Pi * 2 / (W * 3 ) delay := make([] int , 0 , 3 *W) for t := 0 ; t < 3 *W; t++ { img.Image = image.NewPaletted(image.Rect( 0 , 0 , 300 , 300 ), palette.Plan9) for i := 0 ; i <= H*W; i++ { ox := cube.FromTo(cube.Point{}, x[i]) y[i] = geom.Point{cube.InnerProduct(ox, unx), cube.InnerProduct(ox, uny)} a, b := x[i].X, x[i].Z x[i].X = a*math.Cos(stp) - b*math.Sin(stp) x[i].Z = b*math.Cos(stp) + a*math.Sin(stp) } img.Line( 150 + int (y[ 0 ].X), 150 - int (y[ 0 ].Y), 150 + int (y[H*W].X), 150 - int (y[H*W].Y), ) for i := 0 ; i < H*W; i++ { img.Line( 150 + int (y[i].X), 150 - int (y[i].Y), 150 + int (y[i+ 1 ].X), 150 - int (y[i+ 1 ].Y), ) } pics = append(pics, img.Image.(*image.Paletted)) delay = append(delay, 8 ) } file, _ := os.Create( "rotate.gif" ) defer file.Close() gif.EncodeAll(file, &gif.GIF{ Image: pics, Delay: delay, LoopCount: 5 * len(delay), }) } |
以上就是本文的全部内容了,希望大家能够喜欢。