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 }