github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/identicon/block.go (about)

     1  // Copyright 2015 by caixw, All rights reserved
     2  // Use of this source code is governed by a MIT
     3  // license that can be found in the LICENSE file.
     4  
     5  package identicon
     6  
     7  import (
     8  	"image"
     9  	"sync"
    10  )
    11  
    12  var pool = sync.Pool{
    13  	New: func() interface{} { return make([]float64, 0, 10) },
    14  }
    15  
    16  var (
    17  	// 可以出现在中间的方块,一般为了美观,都是对称图像。
    18  	centerBlocks = []blockFunc{b0, b1, b2, b3}
    19  
    20  	// 所有方块
    21  	blocks = []blockFunc{b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16}
    22  )
    23  
    24  // 所有block函数的类型
    25  type blockFunc func(img *image.Paletted, x, y, size float64, angle int)
    26  
    27  // 将多边形points旋转angle个角度,然后输出到img上,起点为x,y坐标
    28  func drawBlock(img *image.Paletted, x, y, size float64, angle int, points []float64) {
    29  	if angle > 0 { // 0角度不需要转换
    30  		// 中心坐标与x,y的距离,方便下面指定中心坐标(x+m,y+m),
    31  		// 0.5的偏移值不能少,否则坐靠右,非正中央
    32  		m := size/2 - 0.5
    33  		rotate(points, x+m, y+m, angle)
    34  	}
    35  
    36  	for i := x; i < x+size; i++ {
    37  		for j := y; j < y+size; j++ {
    38  			if pointInPolygon(i, j, points) {
    39  				img.SetColorIndex(int(i), int(j), 1)
    40  			}
    41  		}
    42  	}
    43  }
    44  
    45  // 全空白
    46  //
    47  //  --------
    48  //  |      |
    49  //  |      |
    50  //  |      |
    51  //  --------
    52  func b0(img *image.Paletted, x, y, size float64, angle int) {
    53  }
    54  
    55  // 全填充正方形
    56  //
    57  //  --------
    58  //  |######|
    59  //  |######|
    60  //  |######|
    61  //  --------
    62  func b1(img *image.Paletted, x, y, size float64, angle int) {
    63  	isize := int(size)
    64  	ix := int(x)
    65  	iy := int(y)
    66  	for i := ix + 1; i < ix+isize; i++ {
    67  		for j := iy + 1; j < iy+isize; j++ {
    68  			img.SetColorIndex(i, j, 1)
    69  		}
    70  	}
    71  }
    72  
    73  // 中间小方块
    74  //  ----------
    75  //  |        |
    76  //  |  ####  |
    77  //  |  ####  |
    78  //  |        |
    79  //  ----------
    80  func b2(img *image.Paletted, x, y, size float64, angle int) {
    81  	l := size / 4
    82  	x = x + l
    83  	y = y + l
    84  
    85  	for i := x; i < x+2*l; i++ {
    86  		for j := y; j < y+2*l; j++ {
    87  			img.SetColorIndex(int(i), int(j), 1)
    88  		}
    89  	}
    90  }
    91  
    92  // 菱形
    93  //
    94  //  ---------
    95  //  |   #   |
    96  //  |  ###  |
    97  //  | ##### |
    98  //  |#######|
    99  //  | ##### |
   100  //  |  ###  |
   101  //  |   #   |
   102  //  ---------
   103  func b3(img *image.Paletted, x, y, size float64, angle int) {
   104  	m := size / 2
   105  	points := pool.Get().([]float64)[:0]
   106  
   107  	drawBlock(img, x, y, size, 0, append(points,
   108  		x+m, y,
   109  		x+size, y+m,
   110  		x+m, y+size,
   111  		x, y+m,
   112  		x+m, y,
   113  	))
   114  
   115  	pool.Put(points)
   116  }
   117  
   118  // b4
   119  //
   120  //  -------
   121  //  |#####|
   122  //  |#### |
   123  //  |###  |
   124  //  |##   |
   125  //  |#    |
   126  //  |------
   127  func b4(img *image.Paletted, x, y, size float64, angle int) {
   128  	points := pool.Get().([]float64)[:0]
   129  	drawBlock(img, x, y, size, angle, append(points,
   130  		x, y,
   131  		x+size, y,
   132  		x, y+size,
   133  		x, y,
   134  	))
   135  
   136  	pool.Put(points)
   137  }
   138  
   139  // b5
   140  //
   141  //  ---------
   142  //  |   #   |
   143  //  |  ###  |
   144  //  | ##### |
   145  //  |#######|
   146  func b5(img *image.Paletted, x, y, size float64, angle int) {
   147  	points := pool.Get().([]float64)[:0]
   148  	m := size / 2
   149  	drawBlock(img, x, y, size, angle, append(points,
   150  		x+m, y,
   151  		x+size,
   152  		y+size,
   153  		x, y+size,
   154  		x+m, y,
   155  	))
   156  
   157  	pool.Put(points)
   158  }
   159  
   160  // b6 矩形
   161  //
   162  //  --------
   163  //  |###   |
   164  //  |###   |
   165  //  |###   |
   166  //  --------
   167  func b6(img *image.Paletted, x, y, size float64, angle int) {
   168  	points := pool.Get().([]float64)[:0]
   169  	m := size / 2
   170  	drawBlock(img, x, y, size, angle, append(points,
   171  		x, y,
   172  		x+m, y,
   173  		x+m, y+size,
   174  		x, y+size,
   175  		x, y,
   176  	))
   177  
   178  	pool.Put(points)
   179  }
   180  
   181  // b7 斜放的锥形
   182  //
   183  //  ---------
   184  //  | #     |
   185  //  |  ##   |
   186  //  |  #####|
   187  //  |   ####|
   188  //  |--------
   189  func b7(img *image.Paletted, x, y, size float64, angle int) {
   190  	points := pool.Get().([]float64)[:0]
   191  	m := size / 2
   192  	drawBlock(img, x, y, size, angle, append(points,
   193  		x, y,
   194  		x+size, y+m,
   195  		x+size, y+size,
   196  		x+m, y+size,
   197  		x, y,
   198  	))
   199  
   200  	pool.Put(points)
   201  }
   202  
   203  // b8 三个堆叠的三角形
   204  //
   205  //  -----------
   206  //  |    #    |
   207  //  |   ###   |
   208  //  |  #####  |
   209  //  |  #   #  |
   210  //  | ### ### |
   211  //  |#########|
   212  //  -----------
   213  func b8(img *image.Paletted, x, y, size float64, angle int) {
   214  	points := pool.Get().([]float64)[:0]
   215  	m := size / 2
   216  	mm := m / 2
   217  
   218  	// 顶部三角形
   219  	drawBlock(img, x, y, size, angle, append(points,
   220  		x+m, y,
   221  		x+3*mm, y+m,
   222  		x+mm, y+m,
   223  		x+m, y,
   224  	))
   225  
   226  	// 底下左边
   227  	drawBlock(img, x, y, size, angle, append(points[:0],
   228  		x+mm, y+m,
   229  		x+m, y+size,
   230  		x, y+size,
   231  		x+mm, y+m,
   232  	))
   233  
   234  	// 底下右边
   235  	drawBlock(img, x, y, size, angle, append(points[:0],
   236  		x+3*mm, y+m,
   237  		x+size, y+size,
   238  		x+m, y+size,
   239  		x+3*mm, y+m,
   240  	))
   241  
   242  	pool.Put(points)
   243  }
   244  
   245  // b9 斜靠的三角形
   246  //
   247  //  ---------
   248  //  |#      |
   249  //  | ####  |
   250  //  |  #####|
   251  //  |  #### |
   252  //  |   #   |
   253  //  ---------
   254  func b9(img *image.Paletted, x, y, size float64, angle int) {
   255  	points := pool.Get().([]float64)[:0]
   256  	m := size / 2
   257  	drawBlock(img, x, y, size, angle, append(points,
   258  		x, y,
   259  		x+size, y+m,
   260  		x+m, y+size,
   261  		x, y,
   262  	))
   263  
   264  	pool.Put(points)
   265  }
   266  
   267  // b10
   268  //
   269  //  ----------
   270  //  |    ####|
   271  //  |    ### |
   272  //  |    ##  |
   273  //  |    #   |
   274  //  |####    |
   275  //  |###     |
   276  //  |##      |
   277  //  |#       |
   278  //  ----------
   279  func b10(img *image.Paletted, x, y, size float64, angle int) {
   280  	points := pool.Get().([]float64)[:0]
   281  	m := size / 2
   282  	drawBlock(img, x, y, size, angle, append(points,
   283  		x+m, y,
   284  		x+size, y,
   285  		x+m, y+m,
   286  		x+m, y,
   287  	))
   288  
   289  	drawBlock(img, x, y, size, angle, append(points[:0],
   290  		x, y+m,
   291  		x+m, y+m,
   292  		x, y+size,
   293  		x, y+m,
   294  	))
   295  
   296  	pool.Put(points)
   297  }
   298  
   299  // b11 左上角1/4大小的方块
   300  //
   301  //  ----------
   302  //  |####    |
   303  //  |####    |
   304  //  |####    |
   305  //  |        |
   306  //  |        |
   307  //  ----------
   308  func b11(img *image.Paletted, x, y, size float64, angle int) {
   309  	points := pool.Get().([]float64)[:0]
   310  	m := size / 2
   311  	drawBlock(img, x, y, size, angle, append(points,
   312  		x, y,
   313  		x+m, y,
   314  		x+m, y+m,
   315  		x, y+m,
   316  		x, y,
   317  	))
   318  
   319  	pool.Put(points)
   320  }
   321  
   322  // b12
   323  //
   324  //  -----------
   325  //  |         |
   326  //  |         |
   327  //  |#########|
   328  //  |  #####  |
   329  //  |    #    |
   330  //  -----------
   331  func b12(img *image.Paletted, x, y, size float64, angle int) {
   332  	points := pool.Get().([]float64)[:0]
   333  	m := size / 2
   334  	drawBlock(img, x, y, size, angle, append(points,
   335  		x, y+m,
   336  		x+size, y+m,
   337  		x+m, y+size,
   338  		x, y+m,
   339  	))
   340  
   341  	pool.Put(points)
   342  }
   343  
   344  // b13
   345  //
   346  //  -----------
   347  //  |         |
   348  //  |         |
   349  //  |    #    |
   350  //  |  #####  |
   351  //  |#########|
   352  //  -----------
   353  func b13(img *image.Paletted, x, y, size float64, angle int) {
   354  	points := pool.Get().([]float64)[:0]
   355  	m := size / 2
   356  	drawBlock(img, x, y, size, angle, append(points,
   357  		x+m, y+m,
   358  		x+size, y+size,
   359  		x, y+size,
   360  		x+m, y+m,
   361  	))
   362  
   363  	pool.Put(points)
   364  }
   365  
   366  // b14
   367  //
   368  //  ---------
   369  //  |   #   |
   370  //  | ###   |
   371  //  |####   |
   372  //  |       |
   373  //  |       |
   374  //  ---------
   375  func b14(img *image.Paletted, x, y, size float64, angle int) {
   376  	points := pool.Get().([]float64)[:0]
   377  	m := size / 2
   378  	drawBlock(img, x, y, size, angle, append(points,
   379  		x+m, y,
   380  		x+m, y+m,
   381  		x, y+m,
   382  		x+m, y,
   383  	))
   384  
   385  	pool.Put(points)
   386  }
   387  
   388  // b15
   389  //
   390  //  ----------
   391  //  |#####   |
   392  //  |###     |
   393  //  |#       |
   394  //  |        |
   395  //  |        |
   396  //  ----------
   397  func b15(img *image.Paletted, x, y, size float64, angle int) {
   398  	points := pool.Get().([]float64)[:0]
   399  	m := size / 2
   400  	drawBlock(img, x, y, size, angle, append(points,
   401  		x, y,
   402  		x+m, y,
   403  		x, y+m,
   404  		x, y,
   405  	))
   406  
   407  	pool.Put(points)
   408  }
   409  
   410  // b16
   411  //
   412  //  ---------
   413  //  |   #   |
   414  //  | ##### |
   415  //  |#######|
   416  //  |   #   |
   417  //  | ##### |
   418  //  |#######|
   419  //  ---------
   420  func b16(img *image.Paletted, x, y, size float64, angle int) {
   421  	points := pool.Get().([]float64)[:0]
   422  	m := size / 2
   423  	drawBlock(img, x, y, size, angle, append(points,
   424  		x+m, y,
   425  		x+size, y+m,
   426  		x, y+m,
   427  		x+m, y,
   428  	))
   429  
   430  	drawBlock(img, x, y, size, angle, append(points[:0],
   431  		x+m, y+m,
   432  		x+size, y+size,
   433  		x, y+size,
   434  		x+m, y+m,
   435  	))
   436  
   437  	pool.Put(points)
   438  }