diff --git a/main.go b/main.go index f17b54a..9bd223f 100644 --- a/main.go +++ b/main.go @@ -3,11 +3,150 @@ package main import ( "crypto/sha1" "fmt" + "slices" "strconv" "github.com/fogleman/gg" ) +func main() { + dc := gg.NewContext(800, 800) + + XBitPolygons(dc, "Jaybee18", 8, 8) + + dc.SavePNG("out.png") +} + +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() + } + } +} + /* 8x8 square of 100x100 px squares @@ -27,10 +166,8 @@ c = 1 1 0 0 ... b = 1 0 1 1 */ -func main() { - dc := gg.NewContext(800, 800) - - hash := hash("Jaybee18") +func FourBitSquares(dc *gg.Context, username string) { + hash := hash(username) colorString := hash[0:6] r, g, b := rgbFromHex(colorString) @@ -51,8 +188,6 @@ func main() { dc.Fill() } } - - dc.SavePNG("out.png") } func rgbFromHex(hex string) (int, int, int) { diff --git a/out.png b/out.png index fb653f6..80388ca 100644 Binary files a/out.png and b/out.png differ