package main import ( "slices" "strconv" "github.com/fogleman/gg" ) func XBitPolygons(dc *gg.Context, username string, columns int, rows int) { hash := hash(username) dc.SetRGB255(255, 255, 255) dc.DrawRectangle(0, 0, 800, 800) dc.Fill() colorString := hash[0:6] r, g, b := rgbFromHex(colorString) dc.SetRGB255(r, g, b) enabledVertices := [][]bool{} for _, character := range hash[6:6+rows+1] { integer, _ := strconv.ParseUint(string(character), 16, columns/2+1) row := []bool{} for j := range columns/2+1 { on := hasBit(integer, j) row = append(row, on) } enabledVertices = append(enabledVertices, row) } w := 800 / columns h := 800 / rows for i := range rows { for j := range columns/2 { topLeft, tlx, tly := enabledVertices[i][j], float64(j*w), float64(i*h) topRight, trx, try := enabledVertices[i][j+1], float64(j*w+w), float64(i*h) bottomRight, brx, bry := enabledVertices[i+1][j+1], float64(j*w+w), float64(i*h+h) bottomLeft, blx, bly := enabledVertices[i+1][j], float64(j*w), float64(i*h+h) mx, my := tlx + float64(w/2), tly + float64(h/2) count := 0 if topLeft {count++} if topRight {count++} if bottomRight {count++} if bottomLeft {count++} if topLeft && topRight { dc.NewSubPath() dc.MoveTo(mx, my) dc.LineTo(tlx, tly) dc.LineTo(trx, try) dc.ClosePath() } if topRight && bottomRight { dc.NewSubPath() dc.MoveTo(mx, my) dc.LineTo(trx, try) dc.LineTo(brx, bry) dc.ClosePath() } if bottomRight && bottomLeft { dc.NewSubPath() dc.MoveTo(mx, my) dc.LineTo(brx, bry) dc.LineTo(blx, bly) dc.ClosePath() } if bottomLeft && topLeft { dc.NewSubPath() dc.MoveTo(mx, my) dc.LineTo(blx, bly) dc.LineTo(tlx, tly) dc.ClosePath() } dc.Fill() } } // Reverse for i := range len(enabledVertices) { slices.Reverse(enabledVertices[i]) } // Mirror left side for i := range rows { for j := range columns/2 { topLeft, tlx, tly := enabledVertices[i][j], float64(w*(columns/2)+j*w), float64(i*h) topRight, trx, try := enabledVertices[i][j+1], float64(w*(columns/2)+j*w+w), float64(i*h) bottomRight, brx, bry := enabledVertices[i+1][j+1], float64(w*(columns/2)+j*w+w), float64(i*h+h) bottomLeft, blx, bly := enabledVertices[i+1][j], float64(w*(columns/2)+j*w), float64(i*h+h) mx, my := tlx+float64(w/2), tly+float64(h/2) count := 0 if topLeft {count++} if topRight {count++} if bottomRight {count++} if bottomLeft {count++} if topLeft && topRight { dc.NewSubPath() dc.MoveTo(mx, my) dc.LineTo(tlx, tly) dc.LineTo(trx, try) dc.ClosePath() } if topRight && bottomRight { dc.NewSubPath() dc.MoveTo(mx, my) dc.LineTo(trx, try) dc.LineTo(brx, bry) dc.ClosePath() } if bottomRight && bottomLeft { dc.NewSubPath() dc.MoveTo(mx, my) dc.LineTo(brx, bry) dc.LineTo(blx, bly) dc.ClosePath() } if bottomLeft && topLeft { dc.NewSubPath() dc.MoveTo(mx, my) dc.LineTo(blx, bly) dc.LineTo(tlx, tly) dc.ClosePath() } dc.Fill() } } }