Loading app-backend/main.go +2 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,8 @@ func main() { r.HandleFunc("/squares/[a-zA-Z0-9\\.]+/?", squares.Square) //cached r.HandleFunc("/squares/[0-8]/[a-zA-Z0-9\\.]+/?", squares.Color) // cached r.HandleFunc("/isogrids/grid/[a-zA-Z0-9]+/?", isogrids.Isogrids) r.HandleFunc("/isogrids/[a-zA-Z0-9]+/?", isogrids.Isogrids) r.HandleFunc("/isogrids/[0-8]/[a-zA-Z0-9]+/?", isogrids.Color) r.HandleFunc("/isogrids/skeleton/[a-zA-Z0-9]+/?", isogrids.Skeleton) r.HandleFunc("/isogrids/diagonals/[a-zA-Z0-9]+/?", isogrids.Diagonals) r.HandleFunc("/isogrids/halfdiagonals/[a-zA-Z0-9]+/?", isogrids.HalfDiagonals) Loading controllers/isogrids/isogrids.go +22 −1 Original line number Diff line number Diff line Loading @@ -38,7 +38,28 @@ func Isogrids(w http.ResponseWriter, r *http.Request) { } size := extract.Size(r) write.ImageSVG(w) draw.IsogridsSkeleton(w, key, bg, fg, size) draw.Isogrids(w, key, bg, fg, size) } } // Isogrids is the handler for /isogrids/[a-zA-Z0-9]+/?. // builds a 10x10 grid with alternate colors based on the string passed in the url. func Color(w http.ResponseWriter, r *http.Request) { if id, err := misc.PermalinkID(r, 2); err != nil { log.Printf("error when extracting permalink id: %v", err) } else { colorMap := tgColors.MapOfColorPatterns() bg, err1 := extract.Background(r) if err1 != nil { bg = colorMap[int(id)][0] } fg, err2 := extract.Foreground(r) if err2 != nil { fg = colorMap[int(id)][1] } size := extract.Size(r) write.ImageSVG(w) draw.IsogridsSkeleton(w, "", bg, fg, size) } } Loading draw/isogrids.go +100 −0 Original line number Diff line number Diff line Loading @@ -487,3 +487,103 @@ func IsogridsRandomMirror(w http.ResponseWriter, key string, color1, color2 colo } canvas.End() } // Isogrids builds an image with 10x10 grids of half diagonals func Isogrids(w http.ResponseWriter, key string, color1, color2 color.RGBA, size int) { canvas := svg.New(w) size = 400 canvas.Start(size, size) lines := 10 fringeSize := size / lines // vertical lines for xL := 0; xL <= lines; xL++ { x := xL * fringeSize firstY := 0 lastY := (lines) * fringeSize style := fmt.Sprintf("stroke:black;stroke-width:2; %s", fillFromRGBA(color2)) if (xL % 2) != 0 { lastY = lastY - fringeSize/2 firstY = fringeSize / 2 } canvas.Line(x, firstY, x, lastY, style) } // y -- > x up right for xL := 0; xL <= 2*lines; xL++ { x := xL * fringeSize style := fmt.Sprintf("stroke:black;stroke-width:2; %s", fillFromRGBA(color2)) xPrev := 0 yPrev := (xL) * fringeSize if yPrev > 0 { canvas.Line(xPrev, yPrev, x*2, 0, style) } } // x --> y down right for xL := -2 * lines; xL <= 2*lines; xL++ { x := xL * fringeSize * 2 style := fmt.Sprintf("stroke:black;stroke-width:2; %s", fillFromRGBA(color2)) xPrev := lines * fringeSize yPrev := (lines - xL*2) * fringeSize if yPrev > 0 { canvas.Line(x, 0, xPrev, yPrev/2, style) } } // triangle grid here: for xL := -1; xL <= lines/2; xL++ { for yL := -1; yL <= lines; yL++ { var x1, x2, x3, y1, y2, y3 int if (xL % 2) == 0 { x1 = (xL) * fringeSize x2 = (xL + 1) * fringeSize x3 = x1 y1 = yL * fringeSize y2 = y1 + fringeSize/2 y3 = (yL + 1) * fringeSize } else { x1 = (xL + 1) * fringeSize x2 = xL * fringeSize x3 = x1 y1 = yL * fringeSize y2 = y1 + fringeSize/2 y3 = (yL + 1) * fringeSize } xs := []int{x1, x2, x3} ys := []int{y1, y2, y3} fill1 := fillFromRGBA(colorFromKey(key, color1, color2, (xL+3*yL+lines)%15)) canvas.Polygon(xs, ys, fmt.Sprintf("stroke:black;stroke-width:2; %s", fill1)) var x11, x12, x13, y11, y12, y13 int if (xL % 2) == 0 { x11 = (xL + 1) * fringeSize x12 = (xL) * fringeSize x13 = x11 y11 = yL*fringeSize + fringeSize/2 y12 = y11 + fringeSize/2 y13 = (yL+1)*fringeSize + fringeSize/2 } else { x11 = (xL) * fringeSize x12 = (xL + 1) * fringeSize x13 = x11 y11 = yL*fringeSize + fringeSize/2 y12 = y1 + fringeSize y13 = (yL+1)*fringeSize + fringeSize/2 } xs1 := []int{x11, x12, x13} ys1 := []int{y11, y12, y13} fill2 := fillFromRGBA(colorFromKey(key, color1, color2, (xL+3*yL+1+lines)%15)) canvas.Polygon(xs1, ys1, fmt.Sprintf("stroke:black;stroke-width:2; %s", fill2)) // apply mirror: xs[0] = (lines * fringeSize) - xs[0] xs[1] = (lines * fringeSize) - xs[1] xs[2] = (lines * fringeSize) - xs[2] xs1[0] = (lines * fringeSize) - xs1[0] xs1[1] = (lines * fringeSize) - xs1[1] xs1[2] = (lines * fringeSize) - xs1[2] canvas.Polygon(xs, ys, fmt.Sprintf("stroke:black;stroke-width:2; %s", fill1)) canvas.Polygon(xs1, ys1, fmt.Sprintf("stroke:black;stroke-width:2; %s", fill2)) } } canvas.End() } Loading
app-backend/main.go +2 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,8 @@ func main() { r.HandleFunc("/squares/[a-zA-Z0-9\\.]+/?", squares.Square) //cached r.HandleFunc("/squares/[0-8]/[a-zA-Z0-9\\.]+/?", squares.Color) // cached r.HandleFunc("/isogrids/grid/[a-zA-Z0-9]+/?", isogrids.Isogrids) r.HandleFunc("/isogrids/[a-zA-Z0-9]+/?", isogrids.Isogrids) r.HandleFunc("/isogrids/[0-8]/[a-zA-Z0-9]+/?", isogrids.Color) r.HandleFunc("/isogrids/skeleton/[a-zA-Z0-9]+/?", isogrids.Skeleton) r.HandleFunc("/isogrids/diagonals/[a-zA-Z0-9]+/?", isogrids.Diagonals) r.HandleFunc("/isogrids/halfdiagonals/[a-zA-Z0-9]+/?", isogrids.HalfDiagonals) Loading
controllers/isogrids/isogrids.go +22 −1 Original line number Diff line number Diff line Loading @@ -38,7 +38,28 @@ func Isogrids(w http.ResponseWriter, r *http.Request) { } size := extract.Size(r) write.ImageSVG(w) draw.IsogridsSkeleton(w, key, bg, fg, size) draw.Isogrids(w, key, bg, fg, size) } } // Isogrids is the handler for /isogrids/[a-zA-Z0-9]+/?. // builds a 10x10 grid with alternate colors based on the string passed in the url. func Color(w http.ResponseWriter, r *http.Request) { if id, err := misc.PermalinkID(r, 2); err != nil { log.Printf("error when extracting permalink id: %v", err) } else { colorMap := tgColors.MapOfColorPatterns() bg, err1 := extract.Background(r) if err1 != nil { bg = colorMap[int(id)][0] } fg, err2 := extract.Foreground(r) if err2 != nil { fg = colorMap[int(id)][1] } size := extract.Size(r) write.ImageSVG(w) draw.IsogridsSkeleton(w, "", bg, fg, size) } } Loading
draw/isogrids.go +100 −0 Original line number Diff line number Diff line Loading @@ -487,3 +487,103 @@ func IsogridsRandomMirror(w http.ResponseWriter, key string, color1, color2 colo } canvas.End() } // Isogrids builds an image with 10x10 grids of half diagonals func Isogrids(w http.ResponseWriter, key string, color1, color2 color.RGBA, size int) { canvas := svg.New(w) size = 400 canvas.Start(size, size) lines := 10 fringeSize := size / lines // vertical lines for xL := 0; xL <= lines; xL++ { x := xL * fringeSize firstY := 0 lastY := (lines) * fringeSize style := fmt.Sprintf("stroke:black;stroke-width:2; %s", fillFromRGBA(color2)) if (xL % 2) != 0 { lastY = lastY - fringeSize/2 firstY = fringeSize / 2 } canvas.Line(x, firstY, x, lastY, style) } // y -- > x up right for xL := 0; xL <= 2*lines; xL++ { x := xL * fringeSize style := fmt.Sprintf("stroke:black;stroke-width:2; %s", fillFromRGBA(color2)) xPrev := 0 yPrev := (xL) * fringeSize if yPrev > 0 { canvas.Line(xPrev, yPrev, x*2, 0, style) } } // x --> y down right for xL := -2 * lines; xL <= 2*lines; xL++ { x := xL * fringeSize * 2 style := fmt.Sprintf("stroke:black;stroke-width:2; %s", fillFromRGBA(color2)) xPrev := lines * fringeSize yPrev := (lines - xL*2) * fringeSize if yPrev > 0 { canvas.Line(x, 0, xPrev, yPrev/2, style) } } // triangle grid here: for xL := -1; xL <= lines/2; xL++ { for yL := -1; yL <= lines; yL++ { var x1, x2, x3, y1, y2, y3 int if (xL % 2) == 0 { x1 = (xL) * fringeSize x2 = (xL + 1) * fringeSize x3 = x1 y1 = yL * fringeSize y2 = y1 + fringeSize/2 y3 = (yL + 1) * fringeSize } else { x1 = (xL + 1) * fringeSize x2 = xL * fringeSize x3 = x1 y1 = yL * fringeSize y2 = y1 + fringeSize/2 y3 = (yL + 1) * fringeSize } xs := []int{x1, x2, x3} ys := []int{y1, y2, y3} fill1 := fillFromRGBA(colorFromKey(key, color1, color2, (xL+3*yL+lines)%15)) canvas.Polygon(xs, ys, fmt.Sprintf("stroke:black;stroke-width:2; %s", fill1)) var x11, x12, x13, y11, y12, y13 int if (xL % 2) == 0 { x11 = (xL + 1) * fringeSize x12 = (xL) * fringeSize x13 = x11 y11 = yL*fringeSize + fringeSize/2 y12 = y11 + fringeSize/2 y13 = (yL+1)*fringeSize + fringeSize/2 } else { x11 = (xL) * fringeSize x12 = (xL + 1) * fringeSize x13 = x11 y11 = yL*fringeSize + fringeSize/2 y12 = y1 + fringeSize y13 = (yL+1)*fringeSize + fringeSize/2 } xs1 := []int{x11, x12, x13} ys1 := []int{y11, y12, y13} fill2 := fillFromRGBA(colorFromKey(key, color1, color2, (xL+3*yL+1+lines)%15)) canvas.Polygon(xs1, ys1, fmt.Sprintf("stroke:black;stroke-width:2; %s", fill2)) // apply mirror: xs[0] = (lines * fringeSize) - xs[0] xs[1] = (lines * fringeSize) - xs[1] xs[2] = (lines * fringeSize) - xs[2] xs1[0] = (lines * fringeSize) - xs1[0] xs1[1] = (lines * fringeSize) - xs1[1] xs1[2] = (lines * fringeSize) - xs1[2] canvas.Polygon(xs, ys, fmt.Sprintf("stroke:black;stroke-width:2; %s", fill1)) canvas.Polygon(xs1, ys1, fmt.Sprintf("stroke:black;stroke-width:2; %s", fill2)) } } canvas.End() }